-
Notifications
You must be signed in to change notification settings - Fork 0
/
nodoAutoma.py
66 lines (56 loc) · 2.43 KB
/
nodoAutoma.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
#questa classe viene utilizzata solo durante la creazione dell'automa
#ogni NodoAutoma ha le sequenze che deve riconoscere (sequenze) e le
#sequenze che sono state messe fino a quel nodo (attuale)
class NodoAutoma:
stato = 0
def __init__(self, sequenze: list[str], attuale: list[str] = [""]):
self.stato = f"S{NodoAutoma.stato}"
NodoAutoma.stato += 1
self.sequenze = sequenze
self.attuale = attuale
@staticmethod
def rimuoviUguali(sequenze: list[str]) -> list[str]:
res = []
for seq in sequenze:
if seq not in res:
res.append(seq)
return res
def inizializza(self):
self.sequenze = self.rimuoviUguali(self.sequenze)
self.puntaA: dict[str, NodoAutoma] = {s[0]: None for s in self.sequenze} #{carattere: nodo a cui punta}
#ogni nodo crea un nodo a cui deve collegarsi, o se già esiste
#si gollega ad esso
def calcolaPunta(self) -> None:
for s in self.sequenze:
inizio = s[0]
continuo = s[1:]
if self.puntaA[inizio]:
if continuo:
self.puntaA[inizio].sequenze.append(continuo)
continue
for seq in self.puntaA.values():
if seq and continuo in seq.sequenze:
self.puntaA[inizio] = seq
self.puntaA[inizio].attuale += [att + inizio for att in self.attuale]
break
else:
self.puntaA[inizio] = NodoAutoma([continuo] if continuo else [], [att + inizio for att in self.attuale])
self.creaNodiSuccessivi()
#crea tutti i nodi successivi
def creaNodiSuccessivi(self) -> None:
for n in self.puntaA.values():
n.inizializza()
n.calcolaPunta()
#se due caratteri puntano allo stesso nodo allora vengono uniti e divisi da una virgola
def unisciPuntaA(self) -> None:
tempDict = {}
for key, value in self.puntaA.items():
if value not in tempDict:
tempDict[value] = []
tempDict[value].append(key)
self.puntaA = {",".join(sorted(keys)): value for value, keys in tempDict.items()}
if __name__ == "__main__":
nodo = NodoAutoma(["ABA", "BBA"], [""])
nodo.inizializza()
nodo.calcolaPunta()
print(nodo.puntaA["B"].puntaA["B"].puntaA["A"].stato) #nodo dopo aver inserito la sequenza BBA