-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTavuttaja.py
More file actions
177 lines (150 loc) · 6.86 KB
/
Tavuttaja.py
File metadata and controls
177 lines (150 loc) · 6.86 KB
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
## -------------------- Tavuttaja -------------------- ##
#Tehnyt: Aarni Junkkala
import SuomiKieliKirjasto as kirjasto #Sisällyttää listoja suomenkielen rakenteesta.
import SanojenErittelija as erittelija #Jakaa lauseen sanoiksi, jolloin lauseen tavuttaminen on helpompaa
# ----- Tavutuksen säännöt ----- #
#Konsonantteja voi olla tavun alussa vaikka kuinka monta, mutta esiintyy vain ulkomaalaisissa sanoissa. esim: sprint|te|ri
#Erikoismerkit eivät tule tavuihin ja jakaa tavun esim: vaa'assa -> vaa|as|sa
#Yhdyssanat, jonka ensimmäinen päättyy konsonanttiin ja toinen alkaa vokaalilla ei toimi. Mahdoton korjata ilman sanakirjaa. Esim: a|si|an|o|mai|set, näy|tön|oh|jain
#Ei tunnista sanan perusmuotoa. esim: ha|uis|sa VS hau|is|sa, ensimmäinen tarkoittaa hakua ja toinen haukea
# ----- Tavutyyppi funktiot ----- ##
#NOTE: Tarkoitettu tavittajaa varten
def LyhytTavut(tavu): #Lyhyet tavut päättyvät lyhyeen vokaaliin. Esim. Ki-vi, koi-ra, kis-sa
if tavu[-1] in kirjasto.vokaalit and tavu[-2] not in kirjasto.vokaalit:
return True
return False
def PitkäTavu(tavu): #Kaikki tavut, jotka eivät ole lyhyitä tavuja, ovat pitkiä. Esim. Maa, Kai-vaa, huu-taa, sii-maa
if LyhytTavut(tavu) == False:
return True
return False
def Avotavu(tavu): #Tavu päättyy vokaaliin. Esim. Ka-la, Pe-li, Ki-ta-ra
if tavu[-1] in kirjasto.vokaalit:
return True
return False
def Umpitavu(tavu): #Tavu päättyy konsonanttiin. Esim. Läm-min, kum-man, nal-let
if tavu[-1] not in kirjasto.vokaalit:
return True
return False
# ----- Tavuttajan funktiot ----- #
def HaeKirjainTyypit(sana):
#HUOM, jos kirjaintyypin hakemiselle tulee tarvetta tämän funktion voi muuttaa omaksi tiedostokseen.
#Palauttaa sanan kirjain tyypit. v= vokaali, k= konsonantti, e= erikoismerkki.
#Esim: kissa -> kvkkv, saari -> kvvkv, C-vitamiini -> kekvkvkvvkv
kirjaintyypit = ""
for i in range(len(sana)):
if sana[i] in kirjasto.vokaalit:
kirjaintyypit += "v"
continue
if sana[i] in kirjasto.konsonantit:
kirjaintyypit += "k"
continue
if sana[i] in kirjasto.erikoismerkit:
kirjaintyypit += "e"
continue
if sana[i] in kirjasto.numerot:
kirjaintyypit += "n"
return kirjaintyypit
## -- Leikkauksen tarkistukset -- ##
#Jokaiselle kirjain tyypille on oma funktio, joka tarkistaa, että leikataanko tavu.
def TarkistaErikoisMerkki(kirjaintyypit, index):
if(index + 1 < len(kirjaintyypit)):
if kirjaintyypit[index + 1] == "e":
LeikkaaTavu()
return True
return False
def TarkistaNumero(kirjaintyypit, index):
if index + 1 < len(kirjaintyypit):
if kirjaintyypit[index] != "n" and kirjaintyypit[index + 1] == "n":
LeikkaaTavu()
return True
if kirjaintyypit[index] == "n" and kirjaintyypit[index + 1] != "n":
LeikkaaTavu()
return True
return False
def TarkistaKonsonantti(kirjaintyypit, index):
#Tarkistaa neljän konsonantin ekstran -> eks|tra
if index >= 2 and index + 2 < len(kirjaintyypit):
if kirjaintyypit[index - 1] == "k" and kirjaintyypit[index] == "k" and kirjaintyypit[index + 1] == "k" and kirjaintyypit[index + 2] == "k":
LeikkaaTavu()
return True
#Poikkeavana ekstrassa on se että, t ja r kirjaimen välistä ei leikata.
if index >= 3 and index + 1 < len(kirjaintyypit):
if kirjaintyypit[index - 2] == "k" and kirjaintyypit[index - 1] == "k" and kirjaintyypit[index] == "k" and kirjaintyypit[index + 1] == "k":
return False
#Tavallinen tavutus konsonanteilla eli seuraava konsonantti ja sitä seuraava vokaali #Esim: saa|ri, olemme siis esimerkissä kirjaimessa a ennen r kirjainta
if(index + 2 < len(kirjaintyypit)): #Jäljellä kaksi kirjainta sanassa
if kirjaintyypit[index + 1] == "k" and kirjaintyypit[index + 2] == "v":
for i in range(index + 1): # Tarkistaa että onko kaikki edeltävät kirjaimet konsonantteja
if kirjaintyypit[i] == "v": #Jos edeltävä on vokaali, niin poikki
LeikkaaTavu()
return True
return False
def TarkistaVokaali(sana, kirjaintyypit, index):
global tavut
if(index + 1 < len(kirjaintyypit)): #Jäljellä yksi kirjain
if kirjaintyypit[index] == "v" and kirjaintyypit[index + 1] == "v": #Molemmat vokaaleja
# väljenevät diftongit
if len(tavut) == 0:
if sana[index] + sana[index + 1] in kirjasto.valjenevatdiftongit:
return False
#Perus diftongi
if sana[index] + sana[index + 1] in kirjasto.diftongit:
return False
#Sama vokaali tuplana
if sana[index] == sana[index + 1]:
return False
#Tave leikataan, koska ei ollut diftongeja
LeikkaaTavu()
return True
return False
#Globaalit muuttujat
tavut = []
tavu = ""
def LeikkaaTavu():
global tavut
global tavu
tavut.append(tavu)
tavu = ""
def Tavuta(sana):
global tavut
global tavu
tavut = []
tavu = ""
#Kirjoittaa ylös isot kirjaimet, niin on helpompi verrata
isot = []
for i in range(len(sana)):
isot.append(sana[i].isupper())
sana = sana.lower() #sana pieneksi
#Hakee kirjaintyypit
kirjaintyypit = HaeKirjainTyypit(sana.lower())
#Jokainen kirjain tavutetaan niin, että kirjain lisätään tavuun, sitten haistellaan, että leikataanko poikki.
for i in range(len(sana)):
if kirjaintyypit[i] != "e": #Erikoismerkkiä ei tule tavuihin
if isot[i] == True:
tavu += sana[i].upper()
if isot[i] == False:
tavu += sana[i]
if kirjaintyypit[i] == "e": #Ohitetaan
continue
if TarkistaErikoisMerkki(kirjaintyypit, i) == True:
continue
if TarkistaKonsonantti(kirjaintyypit, i) == True:
continue
if TarkistaVokaali(sana, kirjaintyypit, i) == True:
continue
if TarkistaNumero(kirjaintyypit, i) == True:
continue
if i == len(sana) - 1:
LeikkaaTavu()
return tavut
def TavutaLause(lause):
sanat = erittelija.MuutaSanoiksi(lause) #Muuttaa lauseen listaksi sanoja
tavutetutSanat = []
for i in range(len(sanat)):
tavutetutSanat.append(Tavuta(sanat[i]))
return tavutetutSanat
#Pyörittää funktiota toistuvasti, jos ei kutsuta ulkopuolelta
if __name__ == "__main__":
while True:
print(TavutaLause(input("Syötä sana, jonka haluat tavuttaa: ")))
print("--------------------")