Ruby, 8618 ถูกต้อง (91.1%), 53 ไบต์, 8618 - 10 * 53 = 8088 คะแนน
->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}
นี่คือฟังก์ชัน Ruby แบบไม่ระบุชื่อซึ่งใช้ regexes เพื่อนับพยางค์
ฟังก์ชั่นเพิ่มพยางค์สำหรับทุกตัวอย่างของ:
- การทำงานของ non-
e
vowels ตามด้วยศูนย์มากกว่าe
s
e
ซึ่งเป็นไม่ได้เป็นส่วนหนึ่งของต่อท้ายed
หรือely
มีข้อยกเว้นของต่อท้ายted
หรือded
s
- ต่อท้าย
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}"