読者です 読者をやめる 読者になる 読者になる

Fizz-Buzz問題の解答に5分ぐらいかかってしまった・・・。

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

どうしてプログラマに・・・プログラムが書けないのか?]

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。

どうしてプログラマに・・・プログラムが書けないのか?]

Javaで実際にコーディングしながら解いてみました。
結果はタイトルにも書きましたが、5分程度*1かかってしまいました(ガーン
処理結果を見ながら解いていたから5分という結果だったのかもしれない。紙にコードを書けって言われたら10分かかるかも。

まあ、コンピュータサイエンス学科卒業じゃないしー。と言い訳しておく。

履歴書に載っている言語のそれぞれで1から10まで数えるループを書けて、電卓なして単純な算術ができ、実際的な問題を解くのに再帰が使えるのであれば、その時点であなたはすでに集団から抜け出していることになるのだ!

どうしてプログラマに・・・プログラムが書けないのか?]

再帰のところが若干不安だけど、たぶん大丈夫。今、頭の中にロジック浮かんだから・・・*2

自分の所属する会社でも採用面接のときは簡単なプログラミング問題を出してるけど、この記事にかかれているように「ふるい」として重要だなあと思う。

最後に、自分が出したFizz-Buzzの解答*3。倍数判定ロジックの部分だけ載せておきます。

private void judge() {
	String fizz = "Fizz";
	String buzz = "Buzz";

	for (int i = 1; i <= 100; i++) {
		System.out.printf("現在の値は %d です。%n", i);

		if ((i % 3) == 0 && (i % 5) == 0) {
			System.out.printf("%s%s%n", fizz, buzz);
		} else if ((i % 3) == 0) {
			System.out.printf("%s%n", fizz);
		} else if ((i % 5) == 0) {
			System.out.printf("%s%n", buzz);
		}
	}
}

よくよく問題を見直してみたら、「数の代わりに」って書いてあった・・・。
上記のプログラムじゃ面接落ちですな。あーあ、出題者の意図を汲めてないなあ*4

*1:倍数を判定してFizzやBuzzと出力するロジック部分のみ

*2:今度、珠玉のプログラミングを購入して読んでおこう・・・

*3:実ははてなのコードハイライト機能を使いたいだけだったり・・・

*4:ゆえに設計書の意図も汲めないことがある