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
e
vocali, seguita da zero di più e
s
- Un
e
che non fa parte di un trailing ed
o ely
, ad eccezione di trailing ted
o ded
s
- 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 slate
ha due vocali ma solo una sillaba.
Per far fronte a questo, eliminiamo e
la 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 ted
o ded
simile settled
o 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 ea
o ee
), e in modo che e
alla 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 ia
di celestial
e 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}"