রুবি, 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
গুলি সনাক্ত করা শক্ত, তবে আমি দুটি ক্ষেত্রে খুঁজে পাই যেখানে সেগুলি প্রায়শই ঘটে:
- একটি trailing অংশ হিসেবে
ed
(যদি না এটি একটি এর ted
বা ded
মত settled
বা saddled
),
- পিছনের অংশ হিসাবে
evy
(যেমন lovely
)
অন্যথায় কী হবে তা এই ক্ষেত্রেগুলি বিশেষত বাদ দেওয়া হয় e.
।
কারণ .
এ e(?!d$|ly).
পরবর্তী গৃহস্থালির কাজ গ্রাস যদি একটি ডবল স্বরবর্ণ (যেমন হয় ea
বা ee
), এবং যাতে e
শব্দের শেষে গণনা করা হয় না। তবে একটি trailing le
হয় সাধারণত উচ্চারিত যাতে ফিরে যোগ করা হয়।
অবশেষে স্বরবর্ণের রানগুলি একটি উচ্চারণ হিসাবে গণনা করা হয়। যদিও এটি সর্বদা ক্ষেত্রে হয় না (যেমন curious
), একাধিক সিলেবল রয়েছে কিনা তা প্রায়শই কাজ করা শক্ত work নিন 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}"