最近こんな記事を書きました。
タイトル通り、以下のツイートを見た男子中学生がプログラミングを学んでいく話です。
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回以上繰り返した後ズンを4回以上繰り返してからドコで終わる文だけを受け入れる決定性有限オートマトンが出来上がりました。
私:ところで、このプログラムは何が利点なの?
夫:超速い。あと、配列 room の中身だけ直せば他の文にも対応できる。君が書いたお話にはこのプログラムを取り入れることはできないだろうけど、こういうものもあるよと。
私:なるほど。
私にとっては速さよりも本で学んだことが早速活かせたことが楽しかったです。