रूबी, 8618 सही (91.1%), 53 बाइट्स, 8618 - 10 * 53 = 8088 स्कोर
->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}
यह एक अनाम रूबी फ़ंक्शन है जो सिलेबल्स की गणना करने के लिए रीग्क्स का उपयोग करता है।
फ़ंक्शन प्रत्येक उदाहरण के लिए एक शब्दांश जोड़ता है:
- गैर-
e
स्वरों का एक भाग , इसके बाद अधिक e
एस का शून्य
- एक
e
जो है नहीं पीछे के हिस्से ed
या ely
अनुगामी के अपवाद के साथ, ted
या ded
रों
- एक अनुगामी
le
विश्लेषण
मूल विचार स्वरों के रनों को गिनना है, लेकिन यह अपने आप में बहुत सटीक नहीं है ( [aeiouy]+
74% सही है)। इसका मुख्य कारण मूक के कारण हैe
, जो स्वयं को उच्चारण न करते हुए पिछली स्वर ध्वनि को संशोधित करता है। उदाहरण के लिए, शब्द slate
में दो स्वर हैं लेकिन केवल एक शब्दांश।
इससे निपटने के लिए, हम e
रेगेक्स के पहले भाग से बाहर निकालते हैं और इसे अलग से मानते हैं। मूक e
एस का पता लगाना कठिन है, लेकिन मुझे दो मामले मिले जहां वे अक्सर होते हैं:
- अनुगामी के भाग के रूप में
ed
(जब तक कि यह ted
या ded
जैसा है settled
या saddled
),
- अनुगामी के भाग के रूप में
evy
(उदाहरण के लिए lovely
)
इन मामलों को विशेष रूप से बाहर रखा गया है अन्यथा क्या होगा e.
।
के लिए कारण .
में e(?!d$|ly).
अगले चार उपभोग करने के लिए अगर वहाँ एक दो स्वर (जैसे है ea
या ee
), और इतना है कि e
शब्द के अंत में गिने जाते हैं। हालाँकि आमतौर पर एक अनुगामी le
का उच्चारण किया जाता है, इसलिए इसे वापस जोड़ा जाता है।
अंत में, स्वर रन को एक शब्दांश के रूप में गिना जाता है। हालांकि यह हमेशा मामला नहीं हो सकता है (उदाहरण के लिए curious
), यह अक्सर बाहर काम करना मुश्किल है कि क्या कई शब्दांश हैं। एक उदाहरण के रूप में, ia
का celestial
और लें spatial
।
परीक्षण कार्यक्रम
मैं वास्तव में रूबी को नहीं जानता, इसलिए मुझे यकीन नहीं है कि यह कितना अच्छा हो सकता है। मैंने बहुत सारे एसओ से परामर्श करके एक परीक्षण कार्यक्रम को एक साथ परिमार्जन करने का प्रबंधन किया था:
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}"