Ruby, 8618 ถูกต้อง (91.1%), 53 ไบต์, 8618 - 10 * 53 = 8088 คะแนน
->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}
นี่คือฟังก์ชัน Ruby แบบไม่ระบุชื่อซึ่งใช้ regexes เพื่อนับพยางค์
ฟังก์ชั่นเพิ่มพยางค์สำหรับทุกตัวอย่างของ:
- การทำงานของ non-
evowels ตามด้วยศูนย์มากกว่าes
eซึ่งเป็นไม่ได้เป็นส่วนหนึ่งของต่อท้ายedหรือelyมีข้อยกเว้นของต่อท้ายtedหรือdeds
- ต่อท้าย
le
การวิเคราะห์
แนวคิดพื้นฐานคือการนับจำนวนเสียงสระ แต่ด้วยตัวของมันเองนั้นไม่แม่นยำมาก ( [aeiouy]+ได้รับ 74% ที่ถูกต้อง) เหตุผลหลักสำหรับเรื่องนี้คือเนื่องจากความเงียบeซึ่งปรับเปลี่ยนเสียงสระก่อนหน้าในขณะที่ไม่ได้ออกเสียงเอง ตัวอย่างเช่นคำว่าslateมีสองเสียงสระ แต่พยางค์เดียวเท่านั้น
เพื่อจัดการกับสิ่งนี้เรานำeส่วนแรกของ regex มาใช้และจัดการแยกต่างหาก การตรวจจับความเงียบeนั้นยาก แต่ฉันพบสองกรณีที่เกิดขึ้นบ่อยครั้ง:
- เป็นส่วนหนึ่งของการติดตาม
ed(เว้นแต่ว่าจะเป็นtedหรือdedชอบsettledหรือsaddled)
- เป็นส่วนหนึ่งของการติดตาม
evy(เช่นlovely)
e.กรณีเหล่านี้ได้รับการยกเว้นเฉพาะในสิ่งที่จะเป็นอย่างอื่น
เหตุผล.ในการที่e(?!d$|ly).จะกินถ่านต่อไปหากมีเสียงสระคู่ (เช่นeaหรือee) และเพื่อที่eจะไม่นับตอนท้ายของคำ อย่างไรก็ตามต่อท้ายle เป็นมักจะออกเสียงเพื่อให้มีการเพิ่มใน
ในที่สุดเสียงสระจะถูกนับเป็นหนึ่งพยางค์ แม้ว่านี่อาจไม่ใช่กรณี (เช่นcurious) แต่ก็มักจะยากที่จะทราบว่ามีหลายพยางค์หรือไม่ ใช้iaของcelestialและspatialเป็นตัวอย่าง
โปรแกรมทดสอบ
ฉันไม่รู้ทับทิมจริงๆดังนั้นฉันจึงไม่แน่ใจว่าจะสามารถตีกอล์ฟได้ดีเพียงใด ฉันจัดการเพื่อขูดโปรแกรมทดสอบร่วมกันโดยปรึกษา SO มากมายแม้ว่า:
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}"