एक शब्द में शब्दांशों की गणना कैसे करें


22

इनपुट: आपको एक स्ट्रिंग दी जाएगी जिसमें एक सिंगल इंग्लिश शब्द होगा। सभी अक्षर लोअरकेस होंगे, और स्ट्रिंग में कोई गैर-अक्षर वर्ण नहीं होगा।

आउटपुट: आप 1 से 7 तक एक पूर्णांक लौटाएंगे जो यह दर्शाता है कि आप शब्द में कितने शब्दांश हैं।

स्कोरिंग: आपका कार्यक्रम इस रिपॉजिटरी में पाए गए सभी शब्दों के खिलाफ चलाया जाएगा । यदि आपको Nशब्द सही मिलते हैं , और आपका प्रोग्राम Mबाइट्स बड़ा है, तो आपका स्कोर है N-(M*10)। सबसे बड़ा स्कोर जीता।

मेरी शब्दांश गिनती उत्पन्न करने के लिए, मैं प्रयोग किया जाता है इस मेरे वचन सूची के रूप में और इस अक्षरों गिनती करने के लिए।


3-शब्दांश शब्दों में "सराय" और "रूबी" शामिल हैं। 2-शब्दांशों में ये शब्द हैं: "irs", "अयस्क", "roy", "yer"। इसके अलावा सूचियाँ पर्याप्त सटीक लगती हैं।

@ अन्याय उन कैच के लिए धन्यवाद। सूचियाँ बनाना निश्चित रूप से चुनौती का सबसे कठिन हिस्सा था।
नाथन मेरिल


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एस का पता लगाना कठिन है, लेकिन मुझे दो मामले मिले जहां वे अक्सर होते हैं:

  • अनुगामी के भाग के रूप में 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}"

ओ, आपने मानक को इतना ऊँचा बना दिया। पायथन में कोड की लंबाई ठीक 20 वर्णों से अधिक लंबी है, इसलिए मेरे आपके "स्वर के बाद एक अक्षर जो लागू नहीं होता है" का कार्यान्वयन e6638 (7158 सही) देता है
4'15 पर

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))

जाहिर तौर पर यह बहुत गंदा था और इतनी जल्दी नहीं था कि Sp3000 के रूबी जवाब को हरा सके। ; ^)


->s{s.scan(/([aiouy]|e(?!$))+/).size}स्कोर 7583. कुछ सरल के लिए 84% बहुत प्रभावशाली है।
Sp3000

1

पर्ल, 8145 - 3 * 30 = 7845

हाल ही में आने से पहले सूचियों का उपयोग करना।

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

फ़ाइलों को हाल ही में अपडेट किया गया है। मैंने एक बार देखा और उन शब्दों को नहीं देखा जिन्हें आपने नाम दिया था 1 शब्दांश फ़ाइल में।
Sp3000

@ Sp3000, खरपतवार। वे जहाँ मैं देख रहा हूँ के अनुसार 7 घंटे पहले अद्यतन किया गया था, और उस लिंक के तहत अभी भी वे शब्द हैं: github.com/nathanmerrill/wordsbysyllables/blob/master/…
Nutki

@NathanMerrill की तरह लगता है कि अद्यतन 7 घंटे पहले गड़बड़ कर दिया: इतिहास
Sp3000

@ Sp3000, धन्यवाद। मैं पुराने संस्करण के स्कोर को अपडेट करता हूं। उन सूचियों में अभी भी कुछ त्रुटियां हैं, लेकिन उतनी गंभीर नहीं हैं।
नटकी

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

क्या हमें एक कार्यक्रम या एक समारोह बनाना चाहिए? तुम्हारा एक कार्यक्रम नहीं है, यह रन के समय कुछ भी नहीं करता है।
जस्टफुल

@ अन्याय मुझे कुछ चाहिए जो इनपुट को स्वीकार करता है और आउटपुट (भले ही वह आउटपुट STDIO न हो)
नाथन मेरिल

Btw मुझे 7 का उपयोग करने के लिए 5150 नहीं मिला, लेकिन 4391। मेरे परीक्षण में इसके len(x)/6बजाय (5377-190 = 5187) का उपयोग करना बेहतर है ।
justhalf

@ अन्याय, अपडेट के साथ, मुझे 5343 मिल रहा है, लेकिन निश्चित रूप से लेन (एक्स) / 6 के साथ एक बदतर स्कोर प्राप्त कर रहा है। मैं अपना परीक्षण कार्यक्रम पोस्ट करूंगा।
नाथन मेरिल

readlines()परिणाम में नई पंक्ति शामिल है। तो वास्तव में तुम्हारा है (len(x)+1)/7+1। आपको read().split('\n')इसके बजाय उपयोग करना चाहिए । हालाँकि मुझे उस फॉर्मूले के लिए 5352 मिले, हालाँकि।
justhalf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.