Rubino, 8618 corretto (91,1%), 53 byte, 8618 - 10 * 53 = punteggio 8088
->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}
Questa è una funzione Ruby anonima che utilizza regex per contare le sillabe.
La funzione aggiunge una sillaba per ogni istanza di:
- Una serie di non
evocali, seguita da zero di più es
- Un
eche non fa parte di un trailing edo ely, ad eccezione di trailing tedo deds
- Un finale
le
Analisi
L'idea di base è contare le serie di vocali, ma questo di per sé non è molto preciso ( [aeiouy]+ottiene il 74% corretto). Il motivo principale di ciò è dovuto al silenzioe , che modifica il suono vocale precedente senza essere pronunciato. Ad esempio, la parola slateha due vocali ma solo una sillaba.
Per far fronte a questo, eliminiamo ela prima parte del regex e la trattiamo separatamente. Rilevare i messaggi di silenzio eè difficile, ma ho trovato due casi in cui si verificano spesso:
- Come parte di un finale
ed(a meno che non sia un tedo dedsimile settledo saddled),
- Come parte di un finale
evy(ad es. lovely)
Questi casi sono specificamente esclusi in ciò che altrimenti sarebbe e..
Il motivo per .in e(?!d$|ly).è di consumare il carattere successivo se c'è una doppia vocale (ad esempio eao ee), e in modo che ealla fine della parola non vengano conteggiati. Tuttavia, di solito le viene pronunciato un finale , quindi viene aggiunto nuovamente.
Infine, le corse vocaliche vengono conteggiate come una sillaba. Anche se questo potrebbe non essere sempre il caso (ad esempio curious), è spesso difficile capire se ci sono più sillabe. Prendi il iadi celestiale spatial, ad esempio.
Programma di test
Non conosco davvero Ruby, quindi non sono sicuro di come possa essere giocato a golf. Sono riuscito a mettere insieme un programma di test consultando molto SO però:
cases = 0
correct = 0
s = "->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}"
f = eval s
for i in 1 ... 8
filepath = i.to_s + "-syllable-words.txt"
file = File.open(filepath)
while (line = file.gets)
word = line.strip
cases += 1
if f.call(word) == i
correct += 1
end
end
end
p "Correct: #{correct}/#{cases}, Length: #{s.length}, Score: #{correct - s.length*10}"