今日、『パーフェクトPHP』を読んでいたところ、range()、array_map()そして無名関数と、fizzbuzzをやるのにぴったりな関数がバシバシ出てきました。ということで、書いてみました、fizzbuzzワンライナー。
<? array_map(function($n){echo$n%15==0?'fizzbuzz':($n%5==0?'buzz':($n%3==0?'fizz':$n));},range(1,100));
↑の行がそれです(折り返してるかもしれませんが、改行はありません)。スクリプト言語の実行結果をブラウザー上で確認できるllevalで、言語をphpにしたあと、上のスクリプトを貼り付けて「eval」すれば、fizzbuzzの結果が確認できます。手元にPHPの実行環境があるなら、そちらでもOK。
このスクリプト、出力は以下のスクリプトと同様です。
<?php
for ($i = 1; $i <= 100; $i++) {
if ($i % 15 === 0) {
echo 'fizzbuzz';
} elseif ($i % 5 === 0) {
echo 'buzz';
} elseif ($i % 3 === 0) {
echo 'fizz';
} else {
echo $i;
}
}
これを、1行でやるにはどうするか。今回利用したのは、「配列の生成」「関数を呼ぶ関数」「無名関数」の組み合わせ。
range()は配列を生成する関数で、例えばrange(1,3)とすると、1から3までの数字を要素にもつ配列を返します。
array_map()は受け取った配列に対して指定された関数を実行する関数。
そして無名関数は、名前をつける必要がなく、その場で実行できるユーザー定義関数。
これらを組み合わせることで、1行でfizzbuzzを実現しています。
また、出来るだけ短くするため、3項演算子をネストして用いたり(可読性が落ちる)、開始タグを省略形にしたり(移植性が落ちる)、比較演算子に===ではなく==を用いていたり(予期せぬ型変換で事故る可能性がある)と、あまり褒められないコーディングスタイルだったりもします。仕事で書くぶんには、後ろのfizzbuzzの方が無難でしょう。