挑戦してみよう!FizzBuzz問題

FizzBuzz(ふぃずばず)問題とは

このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードが書けないプログラマ志願者を見分ける手法をJeff AtwoodがFizzBuzz問題 (FizzBuzz Question) として提唱した。その提唱はインターネットの様々な場所で議論の対象になっている。

wikipedia参照

 

 

やってみよう

条件1 : 1~100の数字を表示する

条件2 : 3の倍数を「fizz」と表示

条件3 : 5の倍数を「buzz」と表示

条件4 : 3と5の公倍数を「fizzbuzz」と表示

条件5 : 言語種別は問わない

 

もし、正しく表示することができれば、

1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17....

 

というようになります。

 

 

筆者がやってみた

私が初めてfizzbuzz問題を解いてみた時の結果です。

言語はPHPで書いています。

※ 答えではありません。

<?php 
//          __ _         _
//         / _(_)_______| |__  _   _ ________
//        | |_| |_  /_  / '_ \| | | |_  /_  /
//        |  _| |/ / / /| |_) | |_| |/ / / /
//        |_| |_/___/___|_.__/ \__,_/___/___|

//1~100の数字を表示する
echo "(1)";
$max = 100;
for( $i=1; $i<=$max; $i++ ){
    echo $i;
    $i==$max ?: print ",";
}
echo '<br>';

//3の倍数を「fizz」と表示
echo "(2)";
outputFizbuzz(3,'fizz');
echo '<br>';

//5の倍数を「buzz」と表示
echo "(3)";
outputFizbuzz(5,'buzz');
echo '<br>';

//3と5の倍数を「fizzbuzz」と表示
echo "(4)";
$ary = [3,5];
outputFizbuzz($ary,'fizzbuzz');

/**
 * 1から順番に$maxで指定された数字までをカンマ区切りで出力します。
 * 指定がなかった場合、デフォルトで100が使用されます。
 * $numで指定された数字を剰余演算にて割り切れた場合に、$strが表示されます。
 *  
 *  @param int or int_array $num
 *  @param String $str
 *  @param int $max
 *
 *  @return void
 */
function outputFizbuzz( $num , $str , $max=100 ){
    if(is_array($num)){
        for( $i=1; $i<=$max; $i++ ){
            $fb = "";
            for( $m=0; $m<count($num); $m++ ){
                $i % $num[$m] != 0 ?: $fb = $str;
            }
            echo $fb == "" ? $i : $fb ;
            $i==$max ?: print ",";
        }
    }else{
        for( $i=1; $i<=$max; $i++ ){
            echo $i % $num == 0 ? $str : $i ;
            $i==$max ?: print ",";
        }
    }
}
?>

 

これを見て、何か違和感を感じた人。

ご名答です。笑

初めてやったときには、それぞれが条件だとは思わず、

それぞれが問題だと考え解いています。

問題さえしっかりと把握してれば、普通に解けたのに...。

 

 

答え

まだ問題を解いていないという人はこれ以降を見ないように注意してください。

 

 

<?php
   for ($count = 1; $count <= 100; $count++){
       if ($count % 3 == 0 && $count % 5 == 0){
           echo 'fizzbuzz';
       }
       elseif ($count % 3 == 0){
           echo 'fizz';
       }
       elseif ($count % 5 == 0){
           echo 'buzz';
       }
       else{
           echo $count;
       }
    echo '<br>';
   }
?>

 

どうでしたか?

これぐらいは簡単に解けないと、プログラマ失格ですね。

 

コメント一覧
  1. 名無し より:

    初めまして。

    一つ質問なのですが、outputFizzbuzz関数に配列を渡す部分(「筆者がやってみた」のコード)をコピペしてみたのですが、

    出力が3と5の場合にもFizzBuzzと出てしまいます。

    どうしてなのでしょうか。

    お手数おかけしますが、ご回答のほどよろしくお願いいたします。

    • took より:

      ご質問ありがとうございます。

      筆者がやってみた部分は答えではありません。
      本来、1~100の数字を表示し、
      3と5の倍数の時 fizzbuzz
      3の倍数の時 fizz
      5の倍数の時 buzz
      ですが、
      始めてfizzbuzz問題を解いた私は、問題の意味を勘違いし、
      問1 1~100の数字を表示する
      問2 3の倍数を「fizz」と表示
      問3 5の倍数を「buzz」と表示
      問4 3と5の倍数を「fizzbuzz」と表示
      という具合に解釈して解いているので、実際の答えとはずれています。

CAPTCHA