fizzbuzzかいてみた

背景

  • とある機会でfizzbuzzを書いたので改めて残しておく

fizzbuzzとは(説明不要だと思うが一応)

・1からnまでの数をプリントするプログラムを書け

・ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること

どうしてプログラマに・・・プログラムが書けないのか?

方針

  • 倍数を計算するコードは共通化したい
  • 文字を出力する部分も共通化し結合していく形にしたい
  • 計算量よりは変更に強いコードにする

コード

<?php
class FizzBuzz
{
    function __construct()
    {
    }

    const MAP = [
        3 => 'Fizz',
        5 => 'Buzz',
    ];

    public function main()
    {
        for ($i = 1; $i <= 15; $i++) {
            echo $this->fizzbuzz($i);
        }
    }

    private function fizzbuzz(int $i): string
    {
        $ret = '';

        // 割り切れるものがあれば対応する文字列を出力
        foreach(self::MAP as $k => $v) {
            if ($i % $k !== 0) {
                continue;
            }
            $ret .= $v;
        }

        // 割り切れるものがなければ入力数値を出力
        if (!$ret) {
            $ret = $i;
        }

        $ret .= "\n";
        return $ret;
    }
}
$fb = new FizzBuzz();
$fb->main();

思ったこと

  • 0って3(5)の倍数に含まれる…?
    • for文が0から始まったらFizzBuzzと表示されてしまう
    • wikiによると0は3の倍数らしい
    • じゃあいいか

倍数 - Wikipedia