課題: フィボナッチ数を出力せよ

qiita.com

素朴にやる

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