初心者も上級者も。FizzBuzz問題について考えてみよう | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

初心者も上級者も。FizzBuzz問題について考えてみよう

皆さんはFizzBuzzというゲームをご存知ですか?
プログラマなら大抵のかたは聞いたことがあるかと思いますが元は単純なパーティゲームで
– 2人以上のプレイヤーが1から順番に数字を発言していく
– 3で割り切れるときは「Fizz」を発言
– 5で割り切れるときは「Buzz」を発言
– 両方で割り切れるときは「FizzBuzz」を発言
– 間違えた人から脱落
細かな違いはあるでしょうが大体上記のようなルールのゲームです。

スポンサーリンク

FizzBuzzとは?

このFizzBuzzをプログラムとして画面に出力するコードを書くことが
FizzBuzzとはプログラマがプログラムを書くことができるか調べるクイズのようなものです。
当然ながらどのプログラム言語を選んでも解くことはできるのでプログラムの勉強を始めた方は一度解いてみてください。
下記のような出力が得られたら正解です。

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34, Buzz, Fizz, ...

解き方

割り切れる場合を求めるので剰余演算子が使えればあとはループ処理の書き方だけですが、
– 剰余演算子を使用せずに書く
– 再帰呼び出しを用いる
– 配列を準備しそれらにmap関数を用いる
など人によって書き方は様々です。
そのほか各言語毎に最小コードもあり、読んでみると(ものすごく読みにくいですが)コードを短縮する工夫が見られます。

解答例

JavaScriptでの解答例を記載してみます。
条件分岐とforにより繰り返し処理で作られています。

for (var i = 1; i <= 100; i++) {
  if (i % 3 == 0 && i % 5 == 0)
    console.log("Fizz,Buzz");
  else if (i % 3 == 0)
    console.log("Fizz");
  else if (i % 5 == 0)
    console.log("Buzz");
  else  // iが3の倍数でも5の倍数でもない
    console.log(i);
}

多分個人的には一番単純なコードだと思います。
テクニカルな書き方をする人は関数の再帰呼び出しや文字列結合をうまくつかったり三項演算子で条件を分けたりするようです。

最後に弊社グラッドキューブ内でよく使われるlivescriptでの最小コードを記載している記事を見つけたので引用させていただきます。

[1 to 100]map ->[k+\zz for k,v of{Fi:3,Bu:5,Ba:7}|it%v<1]*''||it

64文字だそうです。
普段からlivescriptを書いている我々もよくわからないコードが出てきました。
個人的な意見ですが、再帰呼び出しを用いて書く書き方がそこそこかっこよくて読みやすいかと思います。

function fizzbuzz(n) {
  if (n > 1)
    fizzbuzz(n-1);

  if (n % 3 == 0 && n % 5 == 0)
    console.log("Fizz,Buzz");
  else if (n % 3 == 0)
    console.log("Fizz");
  else if (n % 5 == 0)
    console.log("Buzz");
  else
    console.log(n);
}

fizzbuzz(100);

まとめ

今回は最もメジャーなプログラミング問題であるFizzBuzzについて取り上げさせていただきました。
プログラミングを始めた頃はどうやって解こうか頭を抱え、プログラミングに慣れてきた頃にはどうやって書こうかとなやんだのではないでしょうか?
比較的基礎的な問題ですが、調べてみると思わぬユニークな書き方も存在したりします。
最近書いていなかった方は久しぶりに書いてみてはどうでしょう?
思わぬ発見があるかもしれません。


03-6441-3336

いますぐ無料で
お試しください。

SiTestの革新的な機能を、
1か月間無料でお試しいただけます。

お名前【必須】
メールアドレス【必須】
電話番号【必須】

利用規約はこちら