課題: フィボナッチ数を出力せよ
素朴にやる
b, c = ARGV.map(&:to_i) tm = Time.now nxt = 1 + c b1 = 1 s, t = 0, 1 (0..).each do |n| break if Time.now - tm > 1.0 if nxt == n str = s.to_s result = "f(#{n})=" result << if (l = str.length) <= 5 str else str[0, 2] + "(ommit #{l - 4} digits)" + str[-2, 2] end puts result b1 *= b nxt = b1 + c end s, t = t, s + t end
結果。
$ ruby fibo.rb 12 12 f(13)=233 f(24)=46368 f(156)=17(ommit 29 digits)92 f(1740)=19(ommit 360 digits)80 f(20748)=53(ommit 4332 digits)76 f(248844)=93(ommit 52001 digits)08 $ ruby fibo.rb 34 25 f(26)=12(ommit 2 digits)93 f(59)=95(ommit 8 digits)41 f(1181)=29(ommit 243 digits)81 f(39329)=84(ommit 8215 digits)29
一桁足りないな。
他の人のを参考に
https://github.com/angel-p57/qiita-sample/blob/master/fibonacci/plain.rb
require "matrix" b, c = ARGV.map(&:to_i) syscall(37, 1) a = Matrix[[0, 1], [1, 1]] v = (a ** c) * Vector[0, 1] r = 1 loop do x = (a * v)[0] str = x.to_s result = "f(#{r + c})=" result << if (l = str.length) <= 5 str else str[0, 2] + "(ommit #{l - 4} digits)" + str[-2, 2] end puts result r *= b a **= b end