昨日の実装は、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
と書いておこう。