- 浏览: 646361 次
- 性别:
- 来自: Shanghai
文章分类
最新评论
-
107x:
不错,谢谢!
Vim多行缩进技巧 -
can007:
EC2是不负责储存???
体验Amazon EC2 -
vanxining:
书名是什么呢?
Neural Network依然不是理想的AI -
贾懂凯:
缩进的标准是tab,linux默认tab=8。在不同的平台会出 ...
Vim多行缩进技巧 -
edison0951:
貌似他的老师是波谱尔吧,和黑天鹅讲的东西差不多
索罗斯与因果论
如下代码,第一位正确说出它的功能的我会给4星评价,第一个发现其中有何逻辑bug并适当修改的我会给5星。Good luck~
你走了太多的弯路。lambda自带参数校验的。这种场合下inject也不如用n.times直接。
n.times用得果然很巧妙啊,看来我得减少喜欢用inject的不良习惯啦。你说的对,Unmatched arguments那个检验是多余的,而且还有副作用。
另外你lambda最后传self这么做有bug:
不符合f^n(x)的数学定义,self改成args就好了
你走了太多的弯路。lambda自带参数校验的。这种场合下inject也不如用n.times直接。
>>>>还能继续赋值:
其实还有不少例子,比如求质数:
诸如此类在同一数据结构上做重复操作的都可以这么简化
显示不下了-_-
补充一问:
(1..n).inject(args){|result, null| result = self.call(*result)}
和
(1..n).inject(args){|result, null| self.call(*result)}
是一个意思吧?
嗯,比如
(1..10).inject{|sum,i| sum+=i}
可以写成
(1..10).inject{|sum,i| sum+i}
后一种晦涩一些,一般习惯是前面的写法
基本上那个运算的工作原理不是太难理解,意义可能抽象了点,其实你连fibonacci都搞出来了。。。
class Proc def ^ n Proc.new do |*args| (1..n).inject(args){|result, null| result = self.call(*result)} end end end
评论
11 楼
cookoo
2006-10-02
Suninny 写道
你走了太多的弯路。lambda自带参数校验的。这种场合下inject也不如用n.times直接。
class Proc def ^ n raise "Illegal value of power" unless n >= 1 and n.integer? lambda { |*args| n.times {args = call(*args)}; self} end end
n.times用得果然很巧妙啊,看来我得减少喜欢用inject的不良习惯啦。你说的对,Unmatched arguments那个检验是多余的,而且还有副作用。
另外你lambda最后传self这么做有bug:
f = lambda{|x| 2*x} f.call(f.call(2)) #=> 8 (f^2).call 2 #=> #<Proc: ....>
不符合f^n(x)的数学定义,self改成args就好了
10 楼
Suninny
2006-10-02
cookoo 写道
Bingo!
既然连f*g(x) = f(g(x))都想到了,应该不会想不到f^n(x) = f(...f(f(x))...)。这个题目好像太数学化了点,罪过。。。主要是我在思考简化一些数组和矩阵运算时的衍生物。
加了点排错的代码:
其实这里面还有个隐蔽的bug嘿嘿。。。
既然连f*g(x) = f(g(x))都想到了,应该不会想不到f^n(x) = f(...f(f(x))...)。这个题目好像太数学化了点,罪过。。。主要是我在思考简化一些数组和矩阵运算时的衍生物。
加了点排错的代码:
class Proc def ^ n raise "Illegal value of power" unless n >= 1 and n.integer? Proc.new do |*args| raise "Unmatched arguments" unless self.arity == self.call(*args).size (1..n).inject(args){|result, null| result = self.call(*result)} end end end
其实这里面还有个隐蔽的bug嘿嘿。。。
你走了太多的弯路。lambda自带参数校验的。这种场合下inject也不如用n.times直接。
class Proc def ^ n raise "Illegal value of power" unless n >= 1 and n.integer? lambda { |*args| n.times {args = call(*args)}; self} end end
>>>>还能继续赋值:
prime = lambda{|a,*b| print a,' '; b.delete_if{|x|x%a == 0}} op = prime^10 op.call *(2..100)
9 楼
cookoo
2006-10-02
qiezi 写道
果然。改成这样就好看了:
真服了你们这些FP的脑袋。。
f = lambda{|a,b| [b,a+b]} (f^5).call(1,1)
真服了你们这些FP的脑袋。。
其实还有不少例子,比如求质数:
prime = lambda{|a,*b| print a,' '; b.delete_if{|x|x%a == 0}} (prime^10).call *(2..100) #=> 2 3 5 7 11 13 17 19 23 29
诸如此类在同一数据结构上做重复操作的都可以这么简化
8 楼
njmzhang
2006-10-02
lambda {|f| lambda {|h| lambda {|x| f[h[h]][x]}}[lambda {|h| lambda {|x| f[h[h]][x]}}]}[lambda {|f| lambda {|x| x<2 ? 1 : f[x-1] + f[x-2]}}][5] # => 8
显示不下了-_-
lambda {|f| lambda {|h| lambda {|x| f[h[h]][x]}}[lambda {|h| lambda {|x| f[h[h]][x]}}]}\ [lambda {|f| lambda {|x| x<2 ? 1 : f[x-1] + f[x-2]}}][5] # => 8
7 楼
qiezi
2006-10-02
果然。改成这样就好看了:
真服了你们这些FP的脑袋。。
f = lambda{|a,b| [b,a+b]} (f^5).call(1,1)
真服了你们这些FP的脑袋。。
6 楼
cookoo
2006-10-02
Bingo!
既然连f*g(x) = f(g(x))都想到了,应该不会想不到f^n(x) = f(...f(f(x))...)。这个题目好像太数学化了点,罪过。。。主要是我在思考简化一些数组和矩阵运算时的衍生物。
加了点排错的代码:
其实这里面还有个隐蔽的bug嘿嘿。。。
既然连f*g(x) = f(g(x))都想到了,应该不会想不到f^n(x) = f(...f(f(x))...)。这个题目好像太数学化了点,罪过。。。主要是我在思考简化一些数组和矩阵运算时的衍生物。
加了点排错的代码:
class Proc def ^ n raise "Illegal value of power" unless n >= 1 and n.integer? Proc.new do |*args| raise "Unmatched arguments" unless self.arity == self.call(*args).size (1..n).inject(args){|result, null| result = self.call(*result)} end end end
其实这里面还有个隐蔽的bug嘿嘿。。。
5 楼
qiezi
2006-10-02
。。这我倒记不太清了。
其实我第一个感觉,这像是一个生成n个用户级线程的东西,但又只能一起call,所以排除。
第二个感觉是一个benchmark工具,不过又不如直接times来得简单。
这个fibonacci是想这家伙的用途的时候想到的,前面已经给出了它的用法,基本上确定它必须:传入n个参数,并且那个proc也要处理n个参数,根据inject用法,这个call也必须返回n个参数,所以fibonacci只是这其中的一个用法。
真要用它来生成fibonacci的话,其实我宁愿写个简单的:
其实我第一个感觉,这像是一个生成n个用户级线程的东西,但又只能一起call,所以排除。
第二个感觉是一个benchmark工具,不过又不如直接times来得简单。
这个fibonacci是想这家伙的用途的时候想到的,前面已经给出了它的用法,基本上确定它必须:传入n个参数,并且那个proc也要处理n个参数,根据inject用法,这个call也必须返回n个参数,所以fibonacci只是这其中的一个用法。
真要用它来生成fibonacci的话,其实我宁愿写个简单的:
irb> (1..5).inject([1,1]){|a,b| a << a[a.length-2] + a.last} => [1, 1, 2, 3, 5, 8, 13]
4 楼
njmzhang
2006-10-02
如果那个Proc接受的参数个数和它返回的个数不一样就失败了。
类似的,还可以定义*,支持像Haskell那种写法f * g
类似的,还可以定义*,支持像Haskell那种写法f * g
class Proc def * p Proc.new do |*args| self[p[*args]] end end end f = lambda { |a| a * a } g = lambda { |b| b + b } h = f * g h.call(3) # => (3 + 3) * (3 + 3) = 36
3 楼
cookoo
2006-10-02
qiezi 写道
补充一问:
(1..n).inject(args){|result, null| result = self.call(*result)}
和
(1..n).inject(args){|result, null| self.call(*result)}
是一个意思吧?
嗯,比如
(1..10).inject{|sum,i| sum+=i}
可以写成
(1..10).inject{|sum,i| sum+i}
后一种晦涩一些,一般习惯是前面的写法
基本上那个运算的工作原理不是太难理解,意义可能抽象了点,其实你连fibonacci都搞出来了。。。
2 楼
厌倦发呆
2006-10-02
大致是这样
((Proc.new{|a,b,c| print a,b,c;puts;[c,b,a]} ^ 6).call 1,2,3,4,5,6,7,8,9)
^这个方法会返回一个Proc(简称p)调用传给他的block共n次
这个p接受一个数组参数,调用block的时候,将这个参数展开传给他,并期望这个block返回一个数组a,作为下一次调用block要展开的参数
((Proc.new{|a,b,c| print a,b,c;puts;[c,b,a]} ^ 6).call 1,2,3,4,5,6,7,8,9)
^这个方法会返回一个Proc(简称p)调用传给他的block共n次
这个p接受一个数组参数,调用block的时候,将这个参数展开传给他,并期望这个block返回一个数组a,作为下一次调用block要展开的参数
1 楼
qiezi
2006-10-02
我只测试到这个情况:
看这具方法里面new出来的proc的形式,调用应该是这样的:
看起来没有任何意义。。。
不过倒是让我发现它可以干一件无聊的事:
没发现更多的奥秘了,能不能给下官一个小小的提示?
----------------------------------
补充一问:
(1..n).inject(args){|result, null| result = self.call(*result)}
和
(1..n).inject(args){|result, null| self.call(*result)}
是一个意思吧?
(Proc.new{puts 'a'} ^ 3).call 输出: a a a
看这具方法里面new出来的proc的形式,调用应该是这样的:
(Proc.new{ |a| puts a; a } ^ 3).call(1) (Proc.new{ |a, b| puts a + b; [a, b] } ^ 3).call(1, 2) (Proc.new{ |a, b, c| puts a + b + c; [a, b, c] } ^ 3).call(1, 2, 3)
看起来没有任何意义。。。
不过倒是让我发现它可以干一件无聊的事:
(Proc.new{ |a, b| puts "#{b}, #{a+b}"; [b, a + b] } ^ 8).call(1, 1) 输出: 1, 2 2, 3 3, 5 5, 8 8, 13 13, 21 21, 34 34, 55 => [34, 55]
没发现更多的奥秘了,能不能给下官一个小小的提示?
----------------------------------
补充一问:
(1..n).inject(args){|result, null| result = self.call(*result)}
和
(1..n).inject(args){|result, null| self.call(*result)}
是一个意思吧?
发表评论
-
对Django的遗憾
2006-11-08 12:18 17125对django的错失良机我一直觉得很遗憾。我去年大概10月的时 ... -
Rails目前的一些局限
2006-11-08 12:17 2689robbin前面提到了一些局限,如遗留数据库是约定造成的,可以 ... -
Need for Speed
2006-11-06 07:38 6329Erb的渲染一直有人说慢,而c版本的eruby始终没有和Rai ... -
Ruby yield释疑
2006-11-01 03:10 4159context switch不足以表明coroutine,一般 ... -
Passing Parameters to before_filter
2006-10-30 07:23 1995I've just noticed that before_f ... -
ROR: the disruptive innovation
2006-09-29 22:13 1634I happen to read about a great ... -
Farewell, Java
2005-11-20 15:34 1879Evaluation: moving from Java t ... -
Try Ruby
2005-12-22 20:34 1736I'm systematically learning Rub ... -
10 Things Every Java Programmer Should Know About Ruby
2005-12-29 01:35 1653Happened to find this wonderful ... -
Heading fast on Rails~
2006-03-24 00:14 1507Not to mention the recent two S ... -
Ruby小窍门3则
2006-10-29 11:16 2647*怎么转16进制? class Integer de ... -
Ruby的根模块命名空间
2006-10-24 05:30 6825如果你要定制Rails的违例输出页面的话的,一般会用这样的代码 ... -
Rails Cache
2006-10-21 10:59 6487Rails提供三种页面cache方式: action ca ... -
加强版irb
2006-10-20 11:48 10308Ruby的irb和Unix shell一样,通过定制可以提供更 ... -
rake test:units在SQL和Ruby DSL两种schema模式下的差异
2006-10-10 01:16 2288sql方式,会复制development数据库中的外键。相反, ... -
Ruby简化属性声明与初始化
2006-09-27 00:57 2718如果要一边声明一边初始化可以用这样的代码: class O ... -
Ruby和Python的语法差别
2006-09-25 18:35 23214布娃娃在另一个帖子提 ... -
Ruby惯用法
2006-09-19 20:41 23605Ruby有不少惯用法,这里略作一些介绍,也方便阅读他人代码: ... -
对Robbin《ruby on rails为什么暂时无法成为企业应用开发的主流?》的一些思考
2006-09-17 20:19 2335对Rails开发方式我也在思考,对动态类型和meta prog ... -
RJS经验点滴
2006-09-14 14:54 2461所见即所得方式的问卷设计器终于搞定了,一些细节体会: * 任何 ...
相关推荐
英语主题活动有奖竞猜题目PPT课件.pptx
几行编码即可完成的有奖竞猜投注小工具,附源码
有奖猜歌游戏是一款基于uni-app、uniCloud、uniAD 开发的小游戏,通过猜歌曲、观看广告赚取现金奖励。 本游戏基本特征如下: 玩家可以通过猜歌、做任务等方式直接获取现金奖励 玩家可以通过猜歌、拆红包、做任务...
综上所述,这个Java应用程序是一个集成了多媒体功能的有奖竞猜小游戏,它具有图形用户界面,能够播放MP3音频,用户通过与按钮交互参与游戏。程序的设计可能运用了MVC模式,有良好的结构和交互设计,同时展现了Java在...
推广活动是指通过微博平台,进行的一系列的推广活动,包括有奖转发、有奖征集、有奖竞猜、有奖调查等多方面的活动,以提高网站或品牌的知名度和影响力。 微博运营方法的目标是提高网站或品牌的知名度和影响力,并...
3. **有奖竞猜**:这是一种趣味性的推广手段,利用实时热点或娱乐新闻,鼓励用户参与竞猜,如预测足球比赛结果,以提高app的曝光和用户粘性。 4. **有奖问答**:通过应用市场的问卷调查,收集用户反馈,同时提供...
【某集团大型年会项目策划实施方案】是一份详尽的策划文档,主要涵盖了年会的四大模块:总结交流、表彰颁奖、文艺汇演及有奖竞猜、摄影摄像,以及主持人和各环节实施方案的细节。 在年会的整体构思中,强调了“家”...
年会分为几个关键模块,分别是总结交流、表彰颁奖、文艺汇演及有奖竞猜、摄影摄像以及主持人管理。 在【总结交流模块】,策划方案注重创造“家”的氛围,通过接待和启动仪式来展示企业文化。总裁工作报告要求内容...
例如,与论坛官方合作举办签到互动、有奖竞猜和有奖问答等活动,激发用户参与,同时也是一种有效的品牌宣传手段。 在应用市场论坛的运营中,发布关于App的评测文章、介绍特色功能和荣誉,有助于吸引用户关注。有奖...
年会分为几个主要模块,包括总结交流、表彰颁奖、文艺汇演及有奖竞猜,以及摄影摄像和主持人安排。 在**总结交流模块**,集团致力于创造一个家庭般的温馨氛围,通过接待和启动仪式传达“家”的文化。开场部分要求...
在IT行业中,MVC(Model-View-Controller)模式是一种广泛应用的设计模式,尤其在Web开发领域,它将应用程序分为三个主要部分:模型、视图和控制器。基于MVC模式开发完善的抽奖页面,不仅可以提供良好的代码结构,还...
集团大型年会的策划涉及到多个环节,包括接待启动、总结交流、表彰颁奖、文艺汇演、有奖竞猜、摄影摄像以及主持人的准备。 1. **总结交流模块**: - 接待及启动仪式:以“家”为主题,通过精心设计的活动,如拱门...
有奖竞猜环节则是主持人出题,新生抢答,答对有奖,答错则需要做俯卧撑。最后,全体学生会成员与新生合唱一首军歌,标志着慰问活动的结束。 【活动预期效果】 这样的活动不仅可以帮助新生缓解军训压力,增进彼此...
此大型年会策划方案全面考虑了总结交流、表彰颁奖、文艺汇演及有奖竞猜等多个方面的需求,并对各个环节进行了细致周到的规划。从前期准备到现场执行,每一个细节都被精心设计和准备,确保整个年会活动顺利进行,达到...
- **文艺汇演及有奖竞猜**:节目积极向上,注重创意,提前筛选并彩排,确保演出效果。同时,有奖竞猜环节既增加互动,又提高参与度。 - **摄影摄像**:确保全程高清记录,前后场同步,后期制作成光碟留念。 - **...
- **有奖竞猜**: 购买参与活动的商品后,可参加有奖竞猜,正确回答问题的顾客将获得精美小礼品。 - **共享优惠**: 在有奖竞猜环节获胜的顾客可以选择另一位顾客一同参与下一环节,若再次获胜,则两位顾客共同获得...
此外,活动还安排了花样表演和有奖竞猜作为游戏间隔,增加了活动的观赏性和互动性。 整个策划书详尽周到,涵盖了活动的各个环节,确保了活动的有序进行。通过这样的活动,不仅可以增强学生的团队协作能力,提升运动...
- **有奖竞猜**:顾客购买特定商品后可参与有奖竞猜,增加互动性和趣味性。 - **双人同享**:成功竞猜的顾客可以选择另一位顾客共同参与下一轮游戏,获胜者可获得精美礼品。 ##### 2. 推行会员制 - **会员卡优惠**...
7. 主持人与观众互动,进行有奖竞猜。 8. 宣布获胜者名单,颁发证书和奖品。 四、比赛形式 1. 笔试形式。 2. 参赛者随机分为10组。 3. 比赛分为两轮,第一轮优胜者进入第二轮。 五、评分及奖励 1. 设一等奖1名,二...
- **有奖竞猜**:结合年会内容,提高参与度,增加趣味性。 4. **摄影摄像** - **同步与双向播放**:保证现场拍摄与播放同步,照顾到前排后排观众。 - **后期制作**:录制后制作成光盘,记录活动精彩瞬间。 - **...