こんにちは。
最近少しFizzBuzz書けないプログラマ問題が私の周りで話題になったので、FizzBuzzの話です。
そもそもFizzBuzzとは
昔からあるゲームらしいです。
複数人で順番に1から数字を数えていき、3の倍数は数字を言う代わりに「Fizz」、5の倍数は数字を言う代わりに「Buzz」、3の倍数かつ5の倍数(つまり15の倍数)では「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, ...(以下誰かが間違えるまで永遠に続く)
どっかの芸人の3の倍数でバカになるみたいな芸の元ネタだと思います。
FizzBuzz都市伝説
初出はいつなのかわかりませんが、数年前にプロのプログラマでも「FizzBuzz」が書けないやつがいるっていうのが話題になった時期があります。
私が簡単に探した結果、一番古い投稿は2011年のTwitterでした。
今でも定期的にこの話題(FizzBuzzができないプログラマがいる問題)が繰り返されるんですが、正直私の周りには「FizzBuzz」が書けない人なんていません。
プログラム書いたことない人でもHello Worldから始めても1週間もあれば書けるようになるんじゃないかと思います。
とか言いつつ、自分も実際に書いたことはないのでちょっと不安になってFizzBuzzを作ってみました。
FizzBuzzプログラム
私がちょろっと書いたFizzBuzzプログラムがこちら。
言語は何でもよかったんですが、なんとなくC言語を使いました。
プログラムの実行結果
コマンドライン引数無し(./a.out)の場合の実行結果。
コマンドライン引数で30を入力(./a.out 30)した場合の実行結果。
コマンドライン引数で数字以外を入力(./a.out a)した場合の実行結果。
プログラムの解説
需要なんてこれっぽっちもないんでしょうけど、せっかくなので何をやってるのか解説していきます。
必要なライブラリをincludeしています。
標準出力を使うためにstdio、atoiを使うためにstdlibをincludeしています。
いくつまで(どの数字まで)FizzBuzzをやるのかを決めないとプログラムは永遠に間違えることなく数を数え続けるので、上限を決めます。
コマンドライン引数で数字を入力したらその値を上限に設定します。
特に何もコマンドライン引数がない場合、100を上限にしています。
コマンドライン引数は文字列として扱われるので、atoiで数字に変換しています。
atoiに数字以外の文字列を渡したときは返り値が0になるので、返り値が0の場合は標準出力に
と表示してプログラムを終了します。
ここがFizzBuzzを実際にやっている部分です。
1から最大数maxまで同じ処理を繰り返します。
まずiが15の倍数かどうかを判定し、15の倍数なら「Fizz Buzz」と表示ます。
15の倍数じゃなった場合、5の倍数かどうかを判定し、5の倍数なら「Buzz」と表示します。
15の倍数でも5の倍数でもなかった場合、3の倍数かどうかを判定し、3の倍数なら「Fizz」と表示します。
どの倍数でもない場合はiをそのまま表示します。
最大数まで数えたらforループを抜けてreturnしてプログラムを終了します。
一応、このプログラムを書く上で大事なのが15の倍数判定を一番最初に行うことです。
3か5の倍数判定を先に行うと15の倍数でもFizzまたはBuzzとしか表示されなくなってしまいます。
あとは、書く数字を区切るためのカンマをforループの最後に置き、最大数まで数えたら表示しないようにするのも大事。
これをやらないと最後まで数え終わった後にカンマで出力が終わってしまうので見た目が美しくありません。
まとめ
色々作り方はありますが、シンプルに作ると大体こんな感じになるかと思います。
ひとまず自分はしっかりFizzBuzzが書けるようです。
安心しました。
我ながらしょうもないエントリを書いてしまった。
FizzBuzz書けないプログラムは見たことないけど、FizzBuzz書けない(っていうかHello Worldすらできない)マネージャとか営業は大量に要るかもしれません。
彼らは一体どうやって工数見積もりとかしてるのかは謎なのでそこらへんは気になります。
全然まとまってませんがもう特に書くことないので終わります。
おわり。