[PHP]初めてのfizzbuzzワンライナー

今日、『パーフェクト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の方が無難でしょう。

コメントをどうぞ

コメントを残す