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
こっちは剰余演算子は使う場合。とっても素直。