কীভাবে একটি শব্দে সিলেবল গণনা করা যায়


22

ইনপুট: আপনাকে একক ইংরেজী শব্দযুক্ত একটি স্ট্রিং দেওয়া হবে। সমস্ত অক্ষর ছোট হাতের হবে এবং স্ট্রিংগুলিতে কোনও বর্ণমালার অক্ষর থাকবে না।

আউটপুট: আপনি শব্দের মধ্যে কতটি উচ্চারণযোগ্য বলে মনে করছেন তা উপস্থাপন করে আপনি 1 থেকে 7 এর পূর্ণসংখ্যা ফিরে পাবেন return

স্কোরিং: আপনার প্রোগ্রামটি এই সংগ্রহস্থলটিতে পাওয়া সমস্ত শব্দের বিপরীতে পরিচালিত হবে । আপনি যদি Nশব্দগুলি সঠিকভাবে পান এবং আপনার প্রোগ্রামটি Mবাইটস বড় হয় তবে আপনার স্কোর N-(M*10)। বৃহত্তম স্কোর জয়।

আমার শব্দাংশ গণনা উৎপন্ন করার জন্য, আমি ব্যবহার এই আমার কথা তালিকা হিসাবে এবং এই সিলাবল গণনা।


3-বাক্যাংশযুক্ত শব্দের মধ্যে "সরাই" এবং "রুবি" রয়েছে। 2-অক্ষরের শব্দের মধ্যে এগুলি রয়েছে: "আইআরএস", "আকরিক", "রোয়", "ইয়ার"। তালিকাগুলি যথেষ্ট যথাযথ বলে মনে হচ্ছে।
জাস্টহাল্ফ

@ অ্যাডহাল্ফ এই ক্যাচগুলির জন্য আপনাকে ধন্যবাদ। তালিকা তৈরি করা অবশ্যই চ্যালেঞ্জের সবচেয়ে শক্ত অংশ ছিল est
নাথান মেরিল


3
এই চ্যালেঞ্জটি আমাকে অনুধাবন করছে যে ইংরাজী কীভাবে হতে পারে। resumeউদাহরণস্বরূপ নিন ...
Sp3000

উত্তর:


12

রুবি, 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}"

ও, আপনি স্ট্যান্ডার্ডটিকে এত উঁচু করে তুলেছেন। পাইথনে কোডের দৈর্ঘ্য হ'ল 20 অক্ষর দীর্ঘ, সুতরাং আপনার " e
স্বর

2
@ আসরফাল্ফ মূলত আমি রুবি ব্যবহার করার একমাত্র কারণ: পিআই সাধারণত অন্য সব কিছুর জন্য পাইথন ব্যবহার করে।
Sp3000

5

পাইথন 3, 7935 - 10 * 71 = 7225

আমার দ্রুত এবং নোংরা উত্তর: টানা স্বরবর্ণের সংখ্যা গণনা করুন তবে কোনও চূড়ান্ত ই এর প্রথমটি সরিয়ে দিন।

lambda w:len(''.join(" x"[c in"aeiouy"]for c in w.rstrip('e')).split())

ই-কে ছিটকে দেওয়ার পরে, এটি স্বরগুলির সাথে xএবং অন্যান্য সমস্ত অক্ষরকে একটি স্থানের সাথে প্রতিস্থাপন করে । ফলাফলটি আবার একটি স্ট্রিংয়ে যুক্ত হয় এবং তারপরে হোয়াইটস্পেসে বিভক্ত হয়। সুবিধার্থে, প্রারম্ভিক এবং শেষে সাদা স্থান স্পর্শ করা হয় (যেমন " x xx ".split()দেয় ["x","xx"])। ফলাফলের তালিকার দৈর্ঘ্য তাই স্বরগোষ্ঠীর সংখ্যা।

নীচে মূল, 83-বাইট উত্তরটি আরও নির্ভুল ছিল কারণ এটি কেবল শেষে একক ই সরিয়েছে। নতুনটির যেমন শব্দগুলির জন্য সমস্যা রয়েছে bee; তবে সংক্ষিপ্ত কোডটি সেই প্রভাবকে ছাড়িয়ে যায়।

lambda w:len(''.join(" x"[c in"aeiouy"]for c in(w[:-1]if'e'==w[-1]else w)).split())

পরীক্ষা প্রোগ্রাম:

syll = lambda w:len(''.join(c if c in"aeiouy"else' 'for c in w.rstrip('e')).split())

overallCorrect = overallTotal = 0
for i in range(1, 7):
    with open("%s-syllable-words.txt" % i) as f:
        words = f.read().split()
    correct = sum(syll(word) == i for word in words)
    total = len(words)
    print("%s: %s correct out of %s (%.2f%%)" % (i, correct, total, 100*correct/total))
    overallCorrect += correct
    overallTotal += total

print()
print("%s correct out of %s (%.2f%%)" % (overallCorrect, overallTotal, 100*overallCorrect/overallTotal))

স্পষ্টতই এটি খুব নোংরা ছিল এবং স্প 000০০০ এর রুবির উত্তরটি মারার পক্ষে দ্রুত ছিল না। ; ^)


->s{s.scan(/([aiouy]|e(?!$))+/).size}স্কোর 7583. এত সাধারণ কোনও কিছুর জন্য 84% এর আকর্ষণীয় ressive
Sp3000

1

পার্ল, 8145 - 3 * 30 = 7845

সাম্প্রতিক কমিটের আগে থেকে তালিকাগুলি ব্যবহার করা।

#!perl -lp
$_=s/(?!e[ds]?$)[aeiouy]+//g

ফাইলগুলি সম্প্রতি আপডেট করা হয়েছে। আমি একবার দেখেছি এবং 1 টি সিলেবল ফাইলটিতে আপনার নাম দেওয়া শব্দগুলি দেখতে পেলাম না।
Sp3000

@ Sp3000, ক্লান্ত তারা যেখানে see ঘন্টা আগে আমি যা দেখেছি তার অনুসারে আপডেট হয়েছে এবং সেই লিঙ্কের আওতায় এখনও এই শব্দগুলি রয়েছে: github.com/nathanmerrill/wordsbysyllables/blob/master/…
নটকি

দেখে মনে হচ্ছে @ নাথানমিরিল 7 ঘন্টা আগে আপডেটটি গণ্ডগোল করেছেন: ইতিহাস
Sp3000

@ এসপি 3000, ধন্যবাদ আমি স্কোরটি পুরানো সংস্করণে আপডেট করি। এই তালিকাগুলিতে এখনও বেশ কয়েকটি ত্রুটি রয়েছে, তবে ততটা তীব্র নয় not
নটকি

0

পাইথন, 5370-10 * 19 = 5180

এই প্রোগ্রামটি সহজভাবে ধরে নেয় যে দীর্ঘ শব্দগুলির অর্থ আরও উচ্চারণযোগ্য।

lambda x:len(x)/6+1

আমি যে পরীক্ষক প্রোগ্রামটি ব্যবহার করি তা হ'ল:

correct = 0
y = lambda x:len(x)/6+1
for i in xrange(1,8):
    f = file(str(i)+"-syllable-words.txt")
    lines = f.read().split("\n")
    f.close()
    correct += len([1 for line in lines if y(line)==i])
print correct

আমাদের একটি প্রোগ্রাম বা একটি ফাংশন তৈরি করা উচিত? আপনার কোনও প্রোগ্রাম নয়, রান করার সময় এটি কোনও ফল দেয় না।
জাস্টহাল্ফ

@ অ্যাডজাল্ফের আমার এমন কিছু দরকার যা ইনপুট গ্রহণ করে এবং আউটপুট উত্পাদন করে (এমনকি সেই আউটপুটটি স্টাডিও না হলেও)
নাথান মেরিল

বিটিডব্লিউ আমি 750 ব্যবহারের জন্য 5150 পাইনি, তবে 4391. আমার পরীক্ষায় len(x)/6পরিবর্তে (5377-190 = 5187) ব্যবহার করা ভাল ।
জাস্টহাল্ফ

@ আসফাল্ফ আপডেটের সাথে আমি 5343 পাচ্ছি, তবে অবশ্যই লেন (এক্স) / 6 এর সাথে আরও খারাপ স্কোর পাচ্ছি। আমি আমার পরীক্ষা প্রোগ্রাম পোস্ট করব।
নাথান মেরিল

readlines()ফলাফলটিতে নতুন লাইন অন্তর্ভুক্ত। সুতরাং আপনার আসলে (len(x)+1)/7+1read().split('\n')পরিবর্তে আপনার ব্যবহার করা উচিত । যদিও আমি সেই সূত্রটির জন্য 5352 পেয়েছি।
justhalf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.