鍋あり谷あり

テーマを決めずに適当に書いています。

FizzBuzz 剰余なしでもう一回

昨日の実装は、1〜100なら問題ないんだが、1〜百万とかだとメモリが大量に必要になるという欠点があった。
というわけで、メモリ要求が厳しくないものを作ってみた :

require 'generator'

def f(name,n)
  Generator.new{ |g|
    loop{
      (['']*(n-1)+[name]).each{ |i| g.yield i }
    }
  }
end

def fb(sup, *x)
  s=x.map{|name,n| f(name,n)}
  1.upto(sup){ |n|
    puts(
      (r=s.map{|x|x.next}.join).empty? ? n : r 
    )
  }
end

fb( 100, [ 'Fizz', 3], [ 'Buzz', 5 ] )

最初はスレッドで書いてみて、うーむちょっと違うよなぁと思い。
その後 call/cc で書こうと思ったんだが、generator を発見したので、あーそれそれ、と思って generator で書いてみた。

遅延評価の無限列みたいなものを ruby で書くとこんな感じにするのがいいのかな?? 実行速度が遅いけど。

あと。
ブックマークページから来やすいように
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
http://b.hatena.ne.jp/entry/http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
と書いておこう。