最近こんな記事を書きました。
ズンドコキヨシを見かけた男子中学生がプログラミングを勉強していく話
タイトル通り、以下のツイートを見た男子中学生がプログラミングを学んでいく話です。
Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
— てくも (@kumiromilk) 2016年3月9日
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
そんなわけで夫にもズンドコキヨシの話を振ったりするわけですが、夫はこんな感じのことを言っていました。
夫:僕だったらズンドコキヨシは白と黒のとびらを使って実装するな。
私:それって私が最近読んだオートマトンと形式言語についての入門書、白と黒のとびらの?応用できるの?
夫:うん。部屋と扉を二次元配列にすれば解ける。
私:ちょっと待って、自分で考えて実装してみる。
というわけで、状態遷移図を書きながら、次のようなプログラムを作ったわけです。
ちなみに部屋とは何かなんですが、この白と黒のとびらという本では、オートマトンの状態を部屋に、入力を扉に例えています。
def sing
phrase1 = "ズン"
phrase2 = "ドコ"
if Random.rand > 0.5 then
puts phrase1
return phrase1
else
puts phrase2
return phrase2
end
end
room = [[1,0],[2,0],[3,0],[4,0],[4,5],[nil]]
i = 0
until room[i] == [nil] do
if sing == "ズン" then
i = room[i][0]
else
i = room[i][1]
end
end
puts "き・よ・し!"
まず、配列 room ですが、この room の添え字がそのまま部屋番号になります。0号室から5号室まで、全部で6つの部屋があります。
次に、この部屋にはズンとドコのとびらがあります。i号室のズンのとびらは room[i][0] 、 ドコのとびらは room[i][1] です。
そして、配列の各要素には移動先の部屋番号が書いてあります。例えば、4号室に居るときにズンのとびらを開いたら4号室にまた戻ってきます。ドコのとびらを開いたら5号室に移動します。最後の部屋にはこの部屋が最後だと示すためのnilを入れます。
※状態遷移図表
状態\入力 | ズン | ドコ |
---|---|---|
0 | 1へ移動 | 0へ移動 |
1 | 2へ移動 | 0へ移動 |
2 | 3へ移動 | 0へ移動 |
3 | 4へ移動 | 0へ移動 |
4 | 4へ移動 | 5へ移動 |
5 | 終了 | 終了 |
こうすることで、ズンかドコを0回以上繰り返した後ズンを4回以上繰り返してからドコで終わる文だけを受け入れる決定性有限オートマトンが出来上がりました。
私:ところで、このプログラムは何が利点なの?
夫:超速い。あと、配列 room の中身だけ直せば他の文にも対応できる。君が書いたお話にはこのプログラムを取り入れることはできないだろうけど、こういうものもあるよと。
私:なるほど。
私にとっては速さよりも本で学んだことが早速活かせたことが楽しかったです。
ちなみに、この投稿は自身のブログのほぼ転載です。ご了承ください。