非決定性有限オートマトンは、タプル有限状態機械である複数の状態にマッピングされます。すなわち。DFAの通常のδ :Q × Σ → Q遷移関数を別の関数Δ :Q × Σ → P(Q )に置き換えます。
NFAが何であるかがわかっている場合は、次のセクションをスキップできます。
正式な定義
NFAは、
- 状態の有限集合
- 記号の有限集合
- 遷移関数
- は初期状態
- 最終状態の集合
マシンは中から始まりと記号の有限列読み込みのw ∈ Σ *を、各シンボルのために、それは同時に、現在の状態を遷移関数機能を適用すると、現在の状態の集合に状態のそれぞれの新しいセットを追加します。
チャレンジ
この課題のために、我々は無視するまたアルファベットは、常に文字(小文字)になり、それを簡単にするために、Z及び状態の集合となり、{ 0 ... N }整数いくつかの非負のためのN。初期状態は常に0です。
単語を考えるとNFAの説明、あなたのタスクは、すべての最終状態を決定することです。
例
文字列と次の説明を考慮してください。
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
マシンは起動します:
- 読む:新しい状態{ 1 }
- 読み取り新しい状態{ 1 、2 }
- 読む:新しい状態{ 0 }
- 読む:新しい状態{ 1 }
- 読み取り新しい状態{ 1 、2 }
最終状態したがって、出力は次のようになりので。
注:ステップ(2)の状態の遷移にマッピング∅説明は唯一の非空集合への遷移を含んでいます。
ルール
入力は、文字列とNFAの何らかの種類の説明で構成されます(遷移なし):
- 入力文字列は常に{ a … z } ∗の要素になります
- 有効な入力(に限定されません):
- タプル/リストのリスト/配列
- 改行で区切られた入力
- NFAの説明には、結果として空でないセットを持つ遷移のみが含まれます
- 結果が同じ場合、同じ文字を使用してルールを省略できます(例:ルール
0,'a',[1,2]
および0,'b',[1,2]
0,"ab",[1,2]
- 各ルールを個別に取る
0,'a',[1,2]
ことができます(例:ルールは0,'a',[1]
and0,'a',[2]
)
- 結果が同じ場合、同じ文字を使用してルールを省略できます(例:ルール
- 必要に応じて大文字を選択できます
- 入力として状態の数を取ることができます
- 入力のある種の順序付けを想定することができます(例:状態またはシンボルによる順序付け)
出力は、最終状態のリスト/セット/改行で区切られた出力などになります
- 順序は関係ありません
- 重複なし(セットなので)
テストケース
これらの例は、形式になりますタプルのリストです:description word -> states
description
(state,symbol,new-states)
[] "x" -> []
[] "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])] "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])] "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "abb" -> [1,2]