09 February 2012
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
blog comments powered by Disqus