LoginSignup
22
17

More than 5 years have passed since last update.

ズンドコキヨシで決定性有限オートマトン (DFA)

Last updated at Posted at 2016-09-15

 最近こんな記事を書きました。

ズンドコキヨシを見かけた男子中学生がプログラミングを勉強していく話

 タイトル通り、以下のツイートを見た男子中学生がプログラミングを学んでいく話です。

 そんなわけで夫にもズンドコキヨシの話を振ったりするわけですが、夫はこんな感じのことを言っていました。

夫:僕だったらズンドコキヨシは白と黒のとびらを使って実装するな。
私:それって私が最近読んだオートマトンと形式言語についての入門書、白と黒のとびらの?応用できるの?
夫:うん。部屋と扉を二次元配列にすれば解ける。
私:ちょっと待って、自分で考えて実装してみる。

 というわけで、状態遷移図を書きながら、次のようなプログラムを作ったわけです。
 ちなみに部屋とは何かなんですが、この白と黒のとびらという本では、オートマトンの状態を部屋に、入力を扉に例えています。

IMG_2607.JPG

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 の中身だけ直せば他の文にも対応できる。君が書いたお話にはこのプログラムを取り入れることはできないだろうけど、こういうものもあるよと。
私:なるほど。

 私にとっては速さよりも本で学んだことが早速活かせたことが楽しかったです。
 ちなみに、この投稿は自身のブログのほぼ転載です。ご了承ください。

22
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
17