グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



FizzBuzz問題をPHPで解いてみよう【応用編】

前回の記事では、最もメジャーな基本的なプログラミング問題である「FizzBuzz問題」について紹介しました。

FizzBuzz問題をPHPで解いてみよう

今回は「ズンドコキヨシ」、「キヨシチェック」、「ズンドコチェック」などと呼ばれる日本版「FizzBuzz」のようなユニークな問題を解いていきたいと思います。

「ズンドコキヨシ」とは

  • 「ズン」「ドコ」のいずれかをランダムで出力し続ける
  • 「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」と出力して終了する

この記事を執筆時に動作検証を行った筆者の環境

PHP 7.0.14 (cli)

「ズンドコキヨシ」をPHPで実装してよう

<?php
declare(strict_types=1);

$zundoko =   ['ズン', 'ドコ'];
$matchCase = ['ズン', 'ズン', 'ズン', 'ズン', 'ドコ'];
$cache = [];

while(true) {
    $cache[] = $zundoko[array_rand($zundoko)];

    echo end($cache);

    if (count($cache) > 5) {
        array_shift($cache);
    }

    if ($cache === $matchCase) {
        break;
    }
}

echo 'キ・ヨ・シ!', PHP_EOL;
実行結果(別サイトが開きます)
http://sandbox.onlinephpfunctions.com/code/8d5848659f3f1a124a1228ca667143fa61014b26

※「Execute code」ボタンを押すと実行結果が表示されます。

オリジナル版「西郷どん」

筆者は「西郷どん」が大好きです。
その中でも「大山格之助」の同意を促す方言「じゃっ、じゃっ」が大好きです。
「大山格之助」の「じゃっ、じゃっ」をPHP実装してみましょう。

要件定義

  • 誠忠組(幕末の薩摩藩に存在した藩内組織)の苗字、名前、敬称をランダムに出力する
  • ランダムに出力した苗字、名前、敬称に「大山格之助さぁ」が現れたら「じゃっ、じゃっ」と出力して終了する

実装してみよう

<?php
declare(strict_types=1);

class Segodon
{
    const LAST_NAME_LIST = ['西郷', '大久保', '有馬', '大山'];
    const FIRST_NAME_LIST = ['吉之助', '一蔵', '新七', '格之助'];
    const HONORIFICS = ['どん', 'さぁ'];
    const MATCH_CASE = '大山格之助さぁ';

    public function じゃっじゃっ()
    {
        while (true) {
            $name = self::LAST_NAME_LIST[array_rand(self::LAST_NAME_LIST)].self::FIRST_NAME_LIST[array_rand(self::FIRST_NAME_LIST)].self::HONORIFICS[array_rand(self::HONORIFICS)];
            echo $name, PHP_EOL;

            if (self::MATCH_CASE === $name) {
                break;
            }

        }

        echo 'じゃっ、じゃっ', PHP_EOL;
    }
}


$segodon = new Segodon();
$segodon->じゃっじゃっ();

今回はクラス化してみました。

実行結果(別サイトが開きます)
http://sandbox.onlinephpfunctions.com/code/8ca758dfd158e07f9ade0aa26b81cdb52d3f62c5

※「Execute code」ボタンを押すと実行結果が表示されます。

要件追加

  • 誠忠組の苗字、名前、敬称をランダムに出力する
  • ランダムに出力した苗字、名前、敬称に「大山格之助さぁ」が現れたら「じゃっ、じゃっ」と出力して終了する
  • ランダムに出力した苗字、名前、敬称が「西郷吉之助どん」「大久保一蔵どん」「有馬新七さぁ」「大山格之助さぁ」のどれかに含まれていたら「じゃっ、じゃっ」と出力して終了する
<?php
declare(strict_types=1);

class Segodon
{
    const LAST_NAME_LIST = ['西郷', '大久保', '有馬', '大山'];
    const FIRST_NAME_LIST = ['吉之助', '一蔵', '新七', '格之助'];
    const HONORIFICS = ['どん', 'さぁ'];
    const MATCH_CASE = ['西郷吉之助どん', '大久保一蔵どん', '有馬新七さぁ', '大山格之助さぁ'];

    public function じゃっじゃっ()
    {
        while (true) {
            $name = self::LAST_NAME_LIST[array_rand(self::LAST_NAME_LIST)].self::FIRST_NAME_LIST[array_rand(self::FIRST_NAME_LIST)].self::HONORIFICS[array_rand(self::HONORIFICS)];
            echo $name, PHP_EOL;

            if (in_array($name, self::MATCH_CASE, true)) {
                break;
            }

        }

        echo 'じゃっ、じゃっ', PHP_EOL;
    }
}


$segodon = new Segodon();
$segodon->じゃっじゃっ();
実行結果(別サイトが開きます)
http://sandbox.onlinephpfunctions.com/code/c8fe86b1d40b32231bec5344436cd9285b39bd37

※「Execute code」ボタンを押すと実行結果が表示されます。

さいごに

いかがでしたでしょうか?
FizzBuzz問題を応用して、自ら解いてみるのもプログラミングならではの楽しみ方です。

アーティスでは共にプログラミングができる素敵なプログラマを募集中です!
プログラマ募集情報はこちら

この記事を書いた人

アーティス
アーティス
創造性を最大限に発揮するとともに、インターネットに代表されるITを活用し、みんなの生活が便利で、豊かで、楽しいものになるようなサービスやコンテンツを考え、創り出し提供しています。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします