画像提供:マイナビニュース

写真拡大

○FizzBuzz問題で採用の可否?真剣にFizzBuzz問題を解いてみよう

皆さんは『FizzBuzz問題』を知っていますか。この問題は、2007年に話題になり、今でも時々取り上げられるものです。「プログラマーの求人に対する応募者のうち、200人中199人はプログラムが書けない」という衝撃的な記事に触れて、試験でFizzBuzz問題を出題すれば、プログラムを書ける人だけを採用できるという海外の記事が元になっています。この記事が話題になってから、10年以上が経過し、様々なところで取り上げられたため、プログラマーを目指している人の多くが、このFizzBuzz問題を知るようになりました。

それでは、最初に、FizzBuzz問題が、どんなものなのか紹介しましょう。

問題例

1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。

そもそも、FizzBuzzというのは、英語圏でよく知られている言葉遊びです。とても単純なルールなので、プログラミングに堪能な人であれば、5分もあれば書くことができるプログラムです。

とは言え、繰り返しプログラミングの世界で「FizzBuzz問題」が取り上げられるのは、このプログラムを作るために、「繰り返し構文」と「条件分岐構文」が必要となるからです。これらの構文は、プログラミングの基礎中の基礎です。それで、FizzBuzz問題を自分で書くことができるのであれば、プログラマーとして最低条件をクリアしていると言うことができます。

○なでしこでFizzBuzz問題を解く

それでは、Webブラウザで「なでしこの簡易エディタ」を開いて、FizzBuzz問題のプログラムを作ってみましょう。

ぜひ、力試しで自分でプログラムを完成させてみてください。自力でプログラムを完成させることができたら、以下のプログラムを参考にして、答え合わせをしてみましょう。もちろん、FizzBuzz問題に、これという答えはありません。いろいろな解法があります。以下は、解法の一つです。

Nを1から100まで繰り返す

もし、(N%3=0)かつ(N%5=0)ならば「FizzBuzz」と表示。

違えば、もし、N%3=0ならば「Fizz」と表示。

違えば、もし、N%5=0ならば「Buzz」と表示。

違えば、Nを表示。

ここまで。

プログラムを実行すると、以下のように表示されます。

上述のように、FizzBuzz問題には、いろいろな解法があるため、上記とは、全く同じプログラムにならないと思いますが、出力結果が同じものになることを確認しましょう。

ただし、採用試験においては、答えが合っているかだけでなく、応募者がどんなプログラムを書いたのかという点も注目されます。もちろん、プログラムが正しく動くことは当然重要ですが、これから一緒に働く仲間の書いたプログラムが非常に読みにくかったら、一緒に働きたいとは思わないことでしょう。

それでは、もう一つ、FizzBuzz問題の解を紹介しましょう。ここでは、関数を定義し、それを利用します。

Nを1から100まで繰り返す

NでFizzBuzz処理して表示。

ここまで

●(Nで)FizzBuzz処理とは

もし、(Nを15で割った余り)が0ならば「FizzBuzz」で戻る

もし、(Nを3で割った余り)が0ならば「Fizz」で戻る

もし、(Nを5で割った余り)が0ならば「Buzz」で戻る

Nで戻る

ここまで

上記のプログラムは、FizzBuzz、Fizz、Buzz、数値のいずれかを出力する関数「FizzBuzz処理」を定義して、それに1から100までの数値を繰り返し与えるというプログラムとなっています。また、3と5の公倍数である15を利用して、3と5の両方の倍数かを確認したり、「%」演算子の代わりに「NをMで割った余り」関数を使うなど、少しアレンジを加えてみました。

○基本に戻って基本構文を確認しよう - 条件分岐構文

それでは、FizzBuzz問題を解くために、少し基本に戻ってみましょう。まず、FizzBuzz問題では、ある数値が3の倍数か5の倍数かを確認しなくてはなりません。例えば、Nが3の倍数かどうかを判定するプログラムは、以下のようになります。

N = 10

もし、N % 3 = 0ならば

「3の倍数」と表示。

違えば

「3の倍数ではない」と表示。

ここまで。

まずは、プログラムを実行して、動作を確認してみましょう。これは、変数Nの値が3の倍数かを調べるプログラムです。N=10と書いているので、「3の倍数ではない」と表示されます。

ここで、「%」というのは、割り算の余りを調べる演算子です。「10 % 3」と書くなら、10を3で割ると、3余り1なので、演算結果として1という値が得られます。それで、倍数かどうかを調べる場合、余りを調べて、その値が0であれば、倍数ということになります。

そして、倍数かどうか調べるために、「もし..ならば...違えば...ここまで」という条件分岐構文を利用しているという点にも注目しましょう。Nの値をいろいろな値に書き換えてみて、結果がどうなるかを確かめてみましょう。

ちなみに、条件分岐構文で実行するプログラムが単文であれば、下記のように表示することもできます。最初に紹介した、FizzBuzz問題の答えでは、この単文を利用することで、簡潔にプログラムを書くことができました。

N = 10

もし、N % 3 = 0ならば「3の倍数」と表示。

違えば「3の倍数ではない」と表示。

○繰り返し構文

次に、繰り返し構文を確認してみましょう。1から100までを画面に表示するプログラムは、以下のようになります。

Nを1から100まで繰り返す

Nを表示

ここまで

エディタに入力し実行してみると、以下のようになります。

ここまで紹介した、「条件分岐構文」と「繰り返し構文」の二つを組み合わせると、FizzBuzz問題を解くことができます。

○まとめ

以上、今回は、FizzBuzz問題と、それを解くために必要な二つの構文について紹介しました。ここで見たように、FizzBuzz問題自体は、それほど難しくありません。プログラミングの基本をマスターしたら、一度、自力で解けるかどうか試してみると良いでしょう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。