Uma máquina de estados finitos não determinística é uma máquina de estado finito, onde um tuplo é mapeado para vários estados. Ou seja. substituímos a função de transição usual δ : Q × Σ → Q de um DFA por outra função Δ : Q × Σ → P ( Q ) .
Se você sabe o que é um NFA, pode pular a próxima seção.
Definição formal
Um NFA é descrito exclusivamente por
- um conjunto finito de estados
- um conjunto finito de símbolos
- a função de transição
- o estado inicial
- um conjunto de estados finais
A máquina inicia em e lê uma sequência finita de símbolos w ∈ Σ ∗ , para cada símbolo aplicará simultaneamente a função de função de transição com um estado atual e adicionará cada novo conjunto de estados ao conjunto de estados atuais.
Desafio
Para esse desafio, ignoraremos para simplificá-lo. Além disso, o alfabeto sempre será as letras (minúsculas) de a a z e o conjunto de estados será { 0 … N para alguns não negativo inteiro N . O estado inicial será sempre 0 .
Dada a palavra e uma descrição do NFA, sua tarefa é determinar todos os estados finais.
Exemplo
Considere a cadeia e a seguinte descrição:
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
A máquina iniciará em :
- leia um : new states { 1 }
- leia a : novos estados { 1 , 2 }
- leia um : new states { 0 }
- leia um : new states { 1 }
- leia a : novos estados { 1 , 2 }
Portanto, os estados finais e, portanto, a saída seriam .
Nota: Na etapa (2), a transição do estado mapeada para ∅, pois a descrição inclui apenas transições para conjuntos não vazios.
Regras
A entrada consistirá em uma string e algum tipo de descrição do NFA (sem transições ):
- a string de entrada sempre será elemento de
- entradas válidas (não limitadas a):
- lista / matriz de tuplas / listas
- entrada separada por nova linha
- a descrição do NFA conterá apenas transições com conjuntos não vazios como resultado
- você pode abreviar regras com os mesmos caracteres se o resultado for o mesmo (por exemplo, regras
0,'a',[1,2]
e0,'b',[1,2]
pode ser abreviado com0,"ab",[1,2]
- você pode separar cada regra (por exemplo, regra
0,'a',[1,2]
pode ser0,'a',[1]
e0,'a',[2]
)
- você pode abreviar regras com os mesmos caracteres se o resultado for o mesmo (por exemplo, regras
- você pode escolher letras maiúsculas, se quiser
- você pode pegar o número de estados como entrada
- você pode assumir algum tipo de ordenação das entradas (por exemplo, ordenada por estado ou símbolos)
A saída será uma saída separada da lista / conjunto / nova linha etc. dos estados finais
- ordem não importa
- sem duplicatas (como um conjunto)
Casos de teste
Estes exemplos estarão no formato em description word -> states
que description
há uma lista de tuplas (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]