RubyでFizzBuzz問題に終止符を打つ!
FizzBuzz問題はプログラマーが最初に出会う問題だよ
FizzBuzzの解法はプログラマーの数ほどあると言われているよ
でもいつまでもFizzBuzz問題に関わってたら
本当に解決しなければならない問題を解決できないよ
だから僕がFizzBuzz問題に終止符を打つよ!
つまり決定版というべき
FizzBuzzオブジェクトが一つあれば
もうみんながFizzBuzz問題に
頭を悩ませなくても済むはずなんだ
さあ!
class FB module Core def fb ->base,n{ (n%base).zero? }.curry end end {FB:15, F:3, B:5}.each do |name, base| k = Class.new do extend Core define_singleton_method(:===) do |n| fb[base, n] end end const_set(name, k) end extend Core end def fizzbuzz(n) case n when FB::FB; :FizzBuzz when FB::F; :Fizz when FB::B; :Buzz else n end end (1..100).map { |i| fizzbuzz i } # => [1, 2, :Fizz, 4, :Buzz, :Fizz, 7, 8, :Fizz, :Buzz, 11, :Fizz, 13, 14, :FizzBuzz, 16, 17, :Fizz, 19, :Buzz, :Fizz, 22, 23, :Fizz, :Buzz, 26, :Fizz, 28, 29, :FizzBuzz, 31, 32, :Fizz, 34, :Buzz, :Fizz, 37, 38, :Fizz, :Buzz, 41, :Fizz, 43, 44, :FizzBuzz, 46, 47, :Fizz, 49, :Buzz, :Fizz, 52, 53, :Fizz, :Buzz, 56, :Fizz, 58, 59, :FizzBuzz, 61, 62, :Fizz, 64, :Buzz, :Fizz, 67, 68, :Fizz, :Buzz, 71, :Fizz, 73, 74, :FizzBuzz, 76, 77, :Fizz, 79, :Buzz, :Fizz, 82, 83, :Fizz, :Buzz, 86, :Fizz, 88, 89, :FizzBuzz, 91, 92, :Fizz, 94, :Buzz, :Fizz, 97, 98, :Fizz, :Buzz]
FB::FBクラスはfizzbuzzを
FB::Fクラスはfizzを
FB::Bクラスはbuzzをそれぞれ判定するクラスオブジェクトだよ
各クラスは===クラスメソッドでfizzbuzzの判定をするから
case式における比較判定にそのまま使えるんだ
またFBクラスのfbクラスメソッドは
次のように使えるよ
fizzbuzz = FB.fb[15] fizz = FB.fb[3] fizzbuzz[15] # => true fizzbuzz[16] # => false fizz[6] # => true fizz[7] # => false
また一つFizzBuzzを増やしただけだった..
ゴメンナサイm(__)m