ZAPAnet総合情報局 > ZAPAブログ2.0 > この問題が解ければプログラマになれます!

この問題が解ければプログラマになれます!

2007年05月09日 プログラミングTIPS
どうしてプログラマに・・・プログラムが書けないのか?FizzBuzzの中で、「プログラミングの仕事への応募者200人中199人はコードがまったく書けないということで苦労している。」と書かれていました。
そういった類の開発者を見分けるための質問「Fizz-Buzz問題」があるそうで、それは以下の問題になります。
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
コンピュータサイエンス学科卒業生の過半数にはこの問題が解けず、自称上級プログラマが答えを書くのにも10-15分かかることがあるそうです。
ということは逆に考えて、この問題が解けるようになれば、プログラマになる素質を持っているということになりますね!

一応、自分でもPHPで解いてみました。(もし間違っていたら教えてください)
<?php
  for($i=1;$i<=100;$i++){
    if($i%15 == 0){
      echo "FizzBuzz";
    }else if($i%5 == 0){
      echo "Buzz";
    }else if($i%3 == 0){
      echo "Fizz";
    }else{
      echo $i;
    }
    echo "\n";
  }
?>
今回はこんな感じのプログラムにしてみました。

問題文からすると、それぞれの倍数の時にそれぞれの文字を出力し、3と5両方の倍数の時は「Fizz」と「Buzz」をつなげるようにするのが良かったのかもしれません。
そこで、もう一つコードを書いてみました。
<?php
  for($i=1;$i<=100;$i++){
    $str = "";
    if($i%3 == 0){
      $str = "Fizz";
    }
    if($i%5 == 0){
      $str .= "Buzz";
    }
    if($str == ""){
      $str = $i;
    }
    echo $str."\n";
  }
?>
これでも同じ結果が得られます。

どうせ100までしかないのだから、
<?php
echo "1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz\n";
?>
こんな風にしてしまうのも手だとは思います。
(このコードは手書きで書いたのではなく、上のプログラムを改良してこのコードを作りました。手書きが面倒だからプログラムを書くんですよね)


その他の言語の回答例などは、
はてなブックマーク - どうしてプログラマに・・・プログラムが書けないのか?
にたくさん載っています。
とにかくコーディング量を少なくするためのテクニックが披露されたりもしていますが、見やすさ、メンテナンス性と引き替えになってしまっているものもあります。
答えは一つだけじゃないところが、プログラムの面白いところですね。
プログラマを目指している人は、ぜひこの問題に挑戦してみてください。

関連リンク

初めて学ぶWebプログラミング言語は何が良い?
プログラマを目指す人が読んで参考になる(?)ページ
あの問題が解けなくてもプログラマになれます!