ときどきの雑記帖 リターンズ - HaskellでFizz(ry 経由で、Python の repeat を使った odz buffer - FizzBuzz、Haskell の cycle を使った版とまあ似ていなくもないかな…と思った Squeak Smalltalk の #atWrap: を使った版。
(1 to: 100) collect: [:n | | fzbzStr | fzbzStr := (#('' '' Fizz) atWrap: n), (#('' '' '' '' Buzz) atWrap: n). fzbzStr ifEmpty: [n] ifNotEmpty: [fzbzStr]]
Ruby だと、#if_empty を空文字列でないときレシーバを返すように特殊化して(Ruby はブロックを二つ以上とることを捨てているので…)、おおよそこんな感じ。
class Array; def at_wrap(n); self[n % size] end end class String; def if_empty; empty? ? yield : self end end (1..100).collect do |n| fzbz_str = ['Fizz','',''].at_wrap(n) + ['Buzz','','','',''].at_wrap(n) fzbz_str.if_empty {n} end