Ruby, 8618 doğru (% 91.1), 53 bayt, 8618 - 10 * 53 = 8088 puan
->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}
Bu, heceleri saymak için regexes kullanan isimsiz bir Ruby işlevidir.
İşlev, her örneği için bir hece ekler:
eÜnlü olmayan bir harf, ardından sıfırdan daha fazlasıe s
- Bir
eolan olmayan bir eğik bir parçası edya da elyarka hariç olmak üzere, tedya daded s
- Bir iz
le
analiz
Temel fikir, ünlü harfleri saymaktır, ancak bu tek başına çok doğru değildir ( [aeiouy]+% 74 doğru olur). Bunun asıl nedeni , önceki sesli sesi kendisi söylenmeden değiştiren sessizliktire . Örneğin, kelimeslate iki ünlü harfleri var ama sadece tek heceli.
eBununla başa çıkmak için , regex'in ilk bölümünden ayrılıyor ve ayrı olarak işlem yapıyoruz . Sessiz es algılamak zordur, ancak sık sık meydana geldiği iki durum buldum:
- Bir izin parçası olarak
ed(bir tedveya dedbenzeri olmadığı sürece settledveyasaddled ),
- Bir izlemenin parçası olarak
evy(örneğin lovely)
Bu durumlar, aksi takdirde ne olacağı konusunda özellikle dışlanır e. .
Sebebi .in e(?!d$|ly).orada bir çift sesli harf (örn ise bir sonraki kömürü tüketmek olduğunu eaveya ee) ve böylece ekelimenin sonundaki sayılmaz. Bununla birlikte bir arka le olan geri ilave edilir, bu nedenle genellikle, belirgin.
Son olarak, sesli sayılar tek heceli olarak sayılır. Bu her zaman böyle olmasa da (örneğin curious), çoklu hecelerin olup olmadığını anlamak genellikle zordur. Al iaait celestialve spatialbir örnek olarak,.
Test programı
Ruby'yi gerçekten tanımıyorum, bu yüzden ne kadar iyi golf oynayabileceğinden emin değilim. Çok fazla SO danışarak bir test programını bir araya getirmeyi başardım:
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}"