カテゴリー
PHP

ズンドコキヨシ問題をPHPとFSMで解く

先週一部で流行していた、ズンドコキヨシ問題。 Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら […]

先週一部で流行していたズンドコキヨシ問題

ランダムな結果の中から特定のシーケンスが出たら「キヨシ」を出し、終了する、という要件で、解き方はいくらでもあると思いますが、自分が考えたのは有限オートマトンを使ったもの

まずはPHPでFSMを扱っているパッケージを探します。PackagistFSM で検索。ダウンロード数が多いパッケージをいくつか見てみて、使い方が好みなものを選びます。今回は Stagehand_FSM を選びました。業務ならここでパッケージの中を精査するんでしょうけど、まあここでは省略します。


{
"require": {
"piece/stagehand-fsm": "2.4.*"
}
}

Composer で持ってきて呼び出します。楽ちんですね。


require 'vendor/autoload.php';
use Stagehand\FSM\StateMachine\StateMachineBuilder;

ドキュメントにありますが、ステートマシンのインスタンスを作り、状態と遷移と開始(や終了)を与えて動かすだけ。

ということで、与えるデータを作るために、次はズンドコキヨシ問題の遷移図を考えます。”online FSM editor”で検索すると、ブラウザで遷移図を描けるページが見つかりました。これは便利。

zundokokiyoshi_FSM
(間違いがあり、画像を差し替えました。@qckanemoto さんありがとうございました。)

あとは図を基に状態と遷移を与え、それぞれの状態で「ズン」や「ドコ」、あるいは「ドコキヨシ」を表示させれば完成です。

FSMを使う意味

今回のチャレンジを最短の手数で解くだけなら、必ずしもFSMみたいなものを使う必要はないでしょう。ただ、遷移図や遷移表みたいなものを書いて、それをただコードに落とし込む、というのは、抜けを減らせる安心感があります。

# 図を間違うこともありますし、コード化するときに間違うこともありますけどね。テスト書いてないので、業務レベルなら失格です

もし、キヨシが出る条件が頻繁に変わるとか、ズンとドコを使って新しい曲を作りたいとか、同じコードのデータ(遷移表)だけをさまざまに切り替えて別の動作をさせたいとか、そういう方向に仕様の変化が予想される場所なら、使うといいのではないかなと思います。ゲーム系のプログラマーはたぶんこういうの日常的に使ってるのでは。

あとは、描いた遷移図や遷移表からそのままJSONなりの定義が出力できて、それを直接食わせたら動くライブラリ、みたいなものがあると、もっと楽で間違いもないんだろうなあ、と思いました。さらに手間を掛けるならそういうツールやライブラリを探すか、作るかするんでしょうね。

https://www.youtube.com/watch?v=c0H_qGSJKzE

「ズンドコキヨシ問題をPHPとFSMで解く」への7件の返信

コメントは受け付けていません。