【发布时间】:2011-09-19 02:21:20
【问题描述】:
我正在尝试在 Ruby 单行代码中解决来自 Project Euler 的问题,我很好奇 question two 是否有更优雅的解决方案:
斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。
这是我在 Ruby 中的单行解决方案:
(1..32).inject([0,1]) {|arr, i| (arr << arr[-1] + arr[-2] if arr[-1] + arr[-2] <= 4000000) || arr}.inject(0) {|total, i| total += i.even? ? i : 0}
我在这里主要担心的是我使用范围 (1..32) 只是因为我碰巧知道在斐波那契数列中的数字开始超过 4,000,000 之前,这就是所有必要的。我希望以某种方式将其内置到单行中,但我无法弄清楚。
不允许使用分号!
【问题讨论】:
-
我认为,如果“单线”解决方案包含多个块,这会有点颠覆您的挑战精神。我的意思是,如果您不介意一行 500 个字符长且完全不可读的话,您可以用同样的方式编写 Java 单行。
-
这与 Ruby 无关,这只是我正在学习的语言。这只是为了好玩。
-
@aroth,在 Ruby 中链接块就像使用多个算术运算符进行赋值一样自然。对于一个更能打破规则精神的单行字,请参阅我的解决方案:分号是一个死的赠品。
-
@Wayne - 如果在 Ruby 中链接块总是通过使用一行代码来完成,那么我只能说是啊......我永远不会理解为什么看似理性的人会采取不必要的做法混淆代码并使其“自然”。 Ruby 作为一门语言背后的部分设计理念是它应该易于人类阅读和理解,在您的两个示例解决方案中,多行的解决方案是迄今为止最具可读性的。
-
@aroth,我同意。除非它更具可读性,否则我不会将块链接在一行上。有时是,通常不是。我的例子中的单行是因为 OP 要求它,而不是因为它是我要写的。也就是说,写单行是一种有效的练习,就像音乐家演奏音阶一样。您不会在生产代码中编写一个衬里,也不会在音乐会中演奏音阶。