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
e
olan olmayan bir eğik bir parçası ed
ya da ely
arka hariç olmak üzere, ted
ya 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.
e
Bununla başa çıkmak için , regex'in ilk bölümünden ayrılıyor ve ayrı olarak işlem yapıyoruz . Sessiz e
s algılamak zordur, ancak sık sık meydana geldiği iki durum buldum:
- Bir izin parçası olarak
ed
(bir ted
veya ded
benzeri olmadığı sürece settled
veyasaddled
),
- 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 ea
veya ee
) ve böylece e
kelimenin 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 ia
ait celestial
ve spatial
bir ö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}"