koyoweblog log

2010/10/11 までの http://d.hatena.ne.jp/sasashin の記事をインポートしただけです。

Problem 2

http://projecteuler.net/index.php?section=problems&id=2

フィボナッチ数列の項は前の2つの項の和である。
最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万を超えない範囲で、偶数値の項の総和を求めよ。
Note:この問題は最近更新されました。お使いのパラメータが正しいかどうか確認してください。

特に難しくもないわけですが、

  • Object#method 使えば組込みクラスのクラスメソッドのエイリアス作れるなあ
  • inject の別名で reduce ができてた
  • Float::INFINITY で無限を扱える
  • break にブロックの戻り値を書ける

あたりをわかってなかった。

class Integer
  def Integer.fibonacci(x) 
    @@lst||=[1,2]
    (@@lst[x]=(@@lst[x-2]||=(x-2).fibonacci)+(@@lst[x-1]||=(x-1).fibonacci))
  end
end

fibonacci=Integer.method(:fibonacci)

p (2..Float::INFINITY).reduce(0){|r,i|
  break r if fibonacci(i)>4000000
  fibonacci(i).even? ? (r+fibonacci(i)) : r
}