読者です 読者をやめる 読者になる 読者になる

ズンとドコのとびら

memo tech

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

qiita.com

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

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

夫:僕だったらズンドコキヨシは白と黒のとびらを使って実装するな。

私:それってあの本の?応用できるの?

夫:うん。部屋の状態を二次元配列にすれば解ける。

私:ちょっと待って、自分で考えて実装してみる。

というわけで、状態遷移図を書きながら、次のようなプログラムを作ったわけです。

f:id:KZE:20160914222604j:plain

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

私:なるほど。

 私にとっては速さよりも本で学んだことが早速活かせたことが楽しかったです。