2011/01/25

FizzBuzzをRubyで書いてみた

今日、FizzBuzzというものが話題になっているのを見かけました。「FizzBuzzって何なんだろう?」と思って探してみると、Wikipediaにも説明がありました。

FizzBuzz - Wikipedia

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
あぁ、アレですね、ナベアツ。

これをプログラムでどう書くか、というのが今日以下のように盛り上がっていたんです。

Togetter - 「FizzBuzzを30バイトで」
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

じゃあ、僕もやってみよう!ということで、普通にイテレータとifで書いたのがコレ。
(1..100).each {|i|
  if i%3==0 && i%5==0
    p "FizzBuzz"
  elsif i%3==0
    p "Fizz"
  elsif i%5==0
    p "Buzz"
  else
    p i
  end
}
他に方法無いのかなぁと思って調べていたのですが、ちょうどRuby技術者認定試験公式ガイド輪読会の中で勉強した条件演算子が使えそうなことに気がつきました。その条件演算子を使って書いたのがコレ。
(1..100).each{|i|p i%3==0&&i%5==0?"FizzBuzz":i%3==0?"Fizz":i%5==0?"Buzz":i}
おおーなんかシンプルになった!条件演算子って使った事無かったんだけど、こういう風に使うんですね。ちょっとだけ処理を分岐させたいときには便利だなぁ。また一つ新しいことを知りました。Ruby楽しい!

そんな「Ruby技術者認定試験公式ガイド輪読会」、第3回は明日です!お暇なら来てよね!

第3回Ruby技術者認定試験公式ガイド輪読会 : ATND