fizzbuzz

条件分岐のやり方を忘れたネットワーク園児がなんかfizzbuzz書いてみました。ifと剰余演算子を使わない例。(http://bugrammer.g.hatena.ne.jp/nisemono_san/20111008 を見た)

#!ruby

class FizzBuzzer
  @@max = 1000

  def self.define_my_methods num, word
    num.step(@@max, num) {|n|
      define_method "to_#{n}" do
        word
      end
    }
  end

  def method_missing method, *args, &block
    method.to_s =~ /^to_(\d+)$/
    return $1 if $1
    super
  end

  define_my_methods 3, :fizz
  define_my_methods 5, :buzz
  define_my_methods 15, :fizzbuzz
end

(1..100).each do |n|
  puts FizzBuzzer.new.send("to_#{n}")
end

Rubyオブジェクト指向言語なので、オブジェクト指向で書けばこんな感じになると思います。上記だと一応1000までは対応しますね。

追記:よく見たらif文使ってた…orz if $1; super はなくてもfizzbuzzに関しては動くので、上記コードは簡単にifなしにできますが、method_missingでsuperしないのはとってもお行儀が悪いのでおすすめできません。

#!ruby

def fizzbuzz x
  begin
    x / (x % 15)
  rescue
    return :fizzbuzz
  end

  begin
    x / (x % 3)
  rescue
    return :fizz
  end

  begin
    x / (x % 5)
  rescue
    return :buzz
  end

  x

end

(1..100).each do |x|
  puts fizzbuzz x
end

こっちは剰余演算子は使う場合。とっても素直。