PHPでFizzBuzzを書いてみました

なんとなくFizzBuzzが流行っている気がしたので、気のせいかも知れませんが、書いてみようと思いました。実は、FizzBuzzって書いたことないんですよね。

FizzBuzz問題とは?

1、2、3、…という数字の入力に対して

  • 3で割り切れる場合は「Fizz」
  • 5で割り切れる場合は「Buzz」
  • 3でも5でも割り切れる場合は「FizzBuzz」
  • それ以外の場合は数字をそのまま

出力するプログラムを書くことです。

ということで、出力は以下のようになります。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
…

はじめてのFizzBuzz

後藤さんの影響か、なんかやたらしっかりとモデリングしてオブジェクト指向で書かないといけないような風潮が私の周りでは感じられますが、まあ、再利用することもないでしょうから軽く行くことにします。

で、こんな感じになりました。

<?php

function fizz_buzz_spec($num)
{
    if (($num % 15) === 0) {
        return 'FizzBuzz';
    } elseif (($num % 3) === 0) {
        return 'Fizz';
    } elseif (($num % 5) === 0) {
        return 'Buzz';
    } else {
        return $num;
    }
}

function fizz_buzz_echo($carry, $num)
{
    echo fizz_buzz_spec($num), PHP_EOL;
}

array_reduce(range(1, 100), 'fizz_buzz_echo');

おっと、私も後藤さんの影響を受けていたようでarray_reduce()を使ってしまいました。

最短のFizzBuzz

それから、FizzBuzzはなんか最短のコードを競う競技でもあるようなので、短いものも考えてみました。

<?while($i++<100)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,"
";

これで55バイトでした。PHP 5.4 5.5以上で、error_reporting(0)にする必要がありますが。

(2015-04-17 追記) arrayリテラルのデリファレンスはPHP 5.5以降でした。

それから、上記のコードの解説記事を書きました。

関連

Date: 2015/04/16

Tags: php