【インディーズゲーム応援キャンペーン実施中】

FizzBuzz問題で遊んでみよう!

FizzBuzz問題とは

Fizz Buzz(フィズ・バズ、Bizz BuzzBuzzとも呼ばれる)は英語圏で長距離ドライブ中や飲み会の時に行われる言葉遊びです。

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。

Wikipediaより引用

https://ja.wikipedia.org/wiki/Fizz_Buzz

よくプログラムを書く人たちでその言語についての知識を問うために
テストで出されたりとHello World!と同じくらいには有名なプログラムです。

さっそく書いてみる

まずはみんな大好き?なJavaから(環境はJava8)

class Main{
    public static void main(String[] args){ for(int i = 1; i <= 100; ++i){
             System.out.println((i % 3 > 0 ? "" : "Fizz") + (i % 5 > 0 ? (i % 3 > 0 ? i : "") : "Buzz"));
        }
    }
}

Rubyでやってみよう

for i in 1..30
    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end
end

Scalaでやってみた

for(i <- 1 to 100) i match {
  case i if x % 3 == 0 && i % 5 == 0 => println("FizzBuzz")
  case i if x % 3 == 0 => println("Fizz")
  case i if x % 5 == 0 => println("Buzz")
  case _ => println(i)
}

FizzBuzzの考え方について

FizzBuzz問題が初心者向けに使われる事について、
・与えられた問題に対して条件の切り分けが出来るか
・問題について対処が可能か
の点を自分で考えさせられる点がとても理にかなっていると思います。

FizzBuzzで遊ぶ時に考えること
・1から100までの数字を1つずつ切り出す処理
・1から100までの数字一つずつFizzBuzz判定する処理
・3と5と15を拾って処理するが15の処理が最優先になっているか
・判定した後の結果を一つずつ出力する処理

個人的には上の4点に分けて対処すると個々の問題が小さくなって対処も簡単になると感じます。下のように

1から100まで手打ちしたくないのでfor文で繰り返す

繰り返した数字をif文に投げて判定に掛ける

対象の数字(3,5,15)がきたら処理して出力

と問題を小さく切り分けるとどんどん単純になって処理の難易度も下がっていく。この考え方はプログラミングに限らず色々な所で大切になると思う。
プラスαでif文だと長いから三項演算子で一行にまとめて見やすくしようと少し書き換えたのがJavaのコードです。

やってみた感想

久しぶりにFizzBuzzを書いてみたけれどやっぱりJavaはコードの量が多い!
RubyとScalaは後発の言語なので基本的なfor文でも見やすくて可読性も高いと感じた。
問題は小さく切り分けて一つずつ潰していくと対処が楽。絡み合うから面倒に感じるだけで一つひとつは大したことない物が多い。
この考えは大事だなと改めて思い返すこととなった。
次やるときは理解度を上げてコードゴルフみたいに短いコードを目指したりfor文を使わない方法とかあるらしいので違った方向でも遊んでみたいです。

(Written by Takahama)