-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpp2.py
88 lines (72 loc) · 2.58 KB
/
pp2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from copy import copy
class Matriz:
def __init__(self, linhas, colunas):
self.linhas = linhas
self.colunas = colunas
self.celulas = [colunas*[0] for i in range(linhas)]
def __str__(self):
return "\n".join([str(linha) for linha in self.celulas])
def set_celulas(self, celulas):
self.celulas = celulas
self.linhas = len(celulas)
self.colunas = len(celulas[0])
def transpoe(self):
self.set_celulas(list(map(list, zip(*self.celulas))))
def multiplica(self, outra):
celulas = [outra.colunas*[0] for i in range(self.linhas)]
for i in range(self.linhas):
for j in range(outra.colunas):
for k in range(self.colunas):
celulas[i][j] += self.celulas[i][k]*outra.celulas[k][j]
self.set_celulas(celulas)
class AFD:
# estados: quantidade de estados
# alfabeto: quantidade de simbolos
# delta: matriz estados por alfabeto
# inicial: inteiro
# finais: lista de inteiros
def __init__(self, tupla):
self.estados = tupla[0]
self.alfabeto = tupla[1]
self.delta = tupla[2]
self.inicial = tupla[3]
self.finais = tupla[4]
def gera_pi(self):
pi = Matriz(self.estados, 1)
pi.celulas[self.inicial][0] = 1
return pi
def gera_eta(self):
eta = Matriz(self.estados, 1)
for final in self.finais:
eta.celulas[final][0] = 1
return eta
def gera_curry(self):
curry = [Matriz(self.estados, self.estados) for simbolo in range(self.alfabeto)]
for simbolo in range(self.alfabeto):
for estado in range(self.estados):
curry[simbolo].celulas[estado][self.delta[estado][simbolo]] = 1
return curry
def le_palavra(self, palavra):
resultado = self.gera_pi()
resultado.transpoe()
curry = self.gera_curry()
for simbolo in palavra:
resultado.multiplica(curry[simbolo])
resultado.multiplica(self.gera_eta())
return resultado.celulas[0][0]
def main():
representacao_do_afd = eval(input())
alfabeto = 2
tupla = [
representacao_do_afd['estados'],
alfabeto,
representacao_do_afd['delta'],
representacao_do_afd['inicial'],
representacao_do_afd['final']]
A = AFD(tupla)
qtd_palavras = int(input())
for i in range(qtd_palavras):
palavra = [ord(simbolo)-ord('a') for simbolo in input().rstrip('\r')]
print("ACEITA" if A.le_palavra(palavra) else "REJEITA")
if __name__ == '__main__':
main()