सिलेबस अंग्रेजी के शब्दों - तरह का


11

आपको एक प्रोग्राम लिखने का काम सौंपा गया है, जो शब्दों को टेक्स्ट के एक स्ट्रिंग में हाइफ़न के साथ अलग-अलग करता है। यह बहुत काम आएगा, इसलिए आप कुछ हिस्सों को छोड़ना चाहते हैं, मुख्यतः क्योंकि आप सही एल्गोरिथ्म के लिए आवश्यक उच्चारण की तालिका नहीं चाहते हैं। आप इसे इस कार्य के लिए दिए जाने वाले बदला के रूप में यथासंभव संक्षिप्त (और इस प्रकार अपठनीय और अप्राप्य) बनाना चाहते हैं।

आपके पास दो विकल्प हैं:

  • एक प्रोग्राम लिखें जो STDIN से स्ट्रिंग लेता है और परिणाम को STDOUT में आउटपुट करता है।
  • एक फ़ंक्शन लिखें जो स्ट्रिंग को एकल पैरामीटर के रूप में लेता है, और परिणाम देता है।

विशिष्टता

  • इस स्थिति में, स्ट्रिंग का अर्थ है अपनी पसंद की भाषा (बाइट सरणियों, चरित्र सरणियों, तार ...) में किसी भी स्ट्रिंग की तरह निर्माण।
  • स्वर हैं a, e, i, o, u
  • दिए गए स्ट्रिंग में 1 <= n <= 10शब्द हैं, जहां प्रत्येक में 1 - 30वर्णों के बीच की लंबाई है , समावेशी .. आपका आउटपुट उन शब्दों को हाइफ़न होना चाहिए।
  • सभी अक्षर निचले हैं और शब्द हमेशा रिक्त स्थान के साथ अलग होते हैं। इस प्रकार, इनपुट में वर्ण होते हैं[a-z ]
  • महत्व के क्रम में नियम लागू करें।
  • जब कोई शब्द विभाजित होता है, तो शब्द के दाहिने आधे हिस्से के साथ फिर से शुरू करें।

महत्व के क्रम में, पाठ्यक्रम के नियम

लगातार दो एक ही स्वर गिनती के रूप में एक (यानी। feetकेवल एक ही स्वर है, लेकिन beatऔर findingदो है)। प्रत्येक शब्दांश में एक स्वर होता है, इस प्रकार प्रत्येक स्वर के लिए एक शब्दांश होता है।

  1. यदि पूरे शब्द में केवल चार अक्षर हैं, तो उसे अपरिवर्तित लौटा दें। (शेष शब्द के लिए इसे छोड़ें)
  2. यदि शब्द में केवल एक स्वर है, तो अपरिवर्तित शब्द वापस करें।
  3. यदि शब्द में दो लगातार स्वर हैं, तो उनके बीच विभाजित करें (जैसे। diaspora-> di-as-po-ra)
  4. जब दो या दो से अधिक व्यंजन दो स्वरों (समान या भिन्न) के बीच आते हैं, तो पहले व्यंजन (यानी। sis-ter) के बाद विभाजित करें जब तक कि व्यंजन भाग नहीं होता है ck, उस स्थिति में शब्द को उसके बाद विभाजित करते हैं। (अर्थात nickel-> nick-el)
  5. जब yदो स्वरों के बीच आता है, तो इसके बाद शब्द को विभाजित करें (जैसे paying-> pay-ing)।
  6. जब एक व्यंजन दो स्वरों (एक ही या अलग) के बीच आता है, तो व्यंजन (यानी dra-gon) से पहले विभाजित करें।
  7. यदि कोई विभाजन नहीं किया जा सकता है तो अपरिवर्तित शब्द लौटाएं।

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

उदाहरण

In:  hello world
Out: hel-lo world

In:  have a nice day
Out: have a nice day

In:  pour some nickel and xenon there
Out: pour some nick-el and xe-non the-re

क्या आपको यकीन है x-e-non? नियम # 4 का संदर्भ?
जॉन ड्वोरक

@JDDvorak "जब एक शब्द विभाजित होता है, तो शब्द के दाहिने आधे हिस्से के साथ फिर से शुरू करें।", नियम # 6 के बाद।
देखिए

मेरा मतलब है, # 4 को सिलेबल्स के बीच विभाजित नहीं करना चाहिए?
जॉन ड्वोरक

1
नियम # 1 चार अक्षरों के शब्दों से संबंधित है। चार अक्षरों से कम वाले शब्दों का क्या? जैसेlua
डिजिटल ट्रॉमा

1
@DigitalTrauma वे सामान्य रूप से अभियुक्त हैं, लेकिन शायद ही कभी दो शब्दांश हैं।

जवाबों:


6

रूबी, 144 बाइट्स

अगर हम अजेय के लिए जा रहे हैं, तो एक विशालकाय रेगेक्स के बारे में कैसे?

puts gets.split.map {|w| w.scan(/(^.{4}$|[^aeiou]*([aeiou])\2?((?=[^aeiouy]?[aeiou])|ck|[^aeiou]((?=.*[aeiou])|.*$)|$))/).map(&:first)*'-'}*' '

कुछ आउटपुट:

echo "hello world" | ruby syllable.rb
hel-lo world

echo "have a nice day" | ruby syllable.rb
have a nice day

echo "pour some nickel and xenon in there" | ruby syllable.rb
pour some nick-el and xe-non in the-re

echo "diaspora dragon paying sister hemlock happy quicksilver" | ruby syllable.rb
di-as-po-ra dra-gon pay-ing sis-ter hem-lock happy qu-ick-sil-ver

8

लुआ, 292

हो सकता है कि ऐसा करने के लिए लुआ सर्वश्रेष्ठ भाषा न हो, लेकिन यह काम करता है। यह बहुत ज्यादा सवाल की तरह बहती है। नियम मुख्य रूप से कुछ अनुकूलन के क्रम में हैं: # 2 छोड़ दिया गया है (इसकी आवश्यकता नहीं है जब तक कि "ck" के साथ एक स्वर शब्द नहीं है), और ck और y नियम शेष # के पहले से गुजर रहे हैं 4 और # 6, जो संयुक्त हैं। चूंकि शब्द में कुछ स्वरों को दो बार कैप्चर करने की आवश्यकता होती है (एक हाइफ़न के बाद और दूसरे से पहले), उस खोज को दो बार किया जाता है।

i=io.read()v="([aeiou])"for s in i:gfind("%l+ ?")do
if s:len()~=4 then
s=s:gsub(v..v,function(x,y)if x==y then return x..y;end;return x.."-"..y;end)s=s:gsub("ck"..v,"ck-%1")s=s:gsub(v.."y"..v,"%1y-%2")for b=1,2 do
s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")end
end
io.write(s)end

Ungolfed

function checkEquals(x,y)
    if x==y then 
        return x..y
    end
    return x.."-"..y
end
i=io.read()
v="([aeiou])"
for s in i:gfind("%l+ ?") do
    if s:len()~=4 then
        s=s:gsub(v..v,checkEquals)
        s=s:gsub("ck"..v,"ck-%1")
        s=s:gsub(v.."y"..v,"%1y-%2")
        for b=1,2 do
            s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")
        end
    end
    io.write(s)
end

इसका परीक्षण यहां करें: http://ideone.com/g57TzA


मैं माणिक नहीं है, लेकिन यह वास्तव में ठीक लगता है।

4

बैश + कोरटाइल, 173 बाइट्स

मुझे लगता है कि मेरे पास सभी नवीनतम नियम हैं:

v=aeiou
r="[$v])/\1-\2/g"
s=s/\([$v]
e="$s[^$v-])([^$v-]+$r
"
tr \  \\n|sed -r "/^([a-z]{4}|[^$v]*[$v][^$v]*)$/bx
$s)($r
${s}ck)($r
$e$e${s}y)($r
$s)([^$v-]$r
:x"|tr \\n \ 

नोट अंतिम पंक्ति का अंतिम वर्ण एक (स्थान) है।

मुझे लगता है कि यह पर्याप्त रूप से "अपठनीय और अचूक" को संतुष्ट करता है ; ;-)

STDIN से इनपुट लेता है।

ज्यादातर सीधे रेगेक्स प्रतिस्थापन। sedअभिव्यक्ति की पहली पंक्ति नियम 1 और 2 से मेल खाती है, फिर बस :xअभिव्यक्ति के अंत में लेबल पर कूद जाती है ।

trआरंभ और पाइप लाइन के अंत में शब्दों न्यू लाइन से अलग की गई है, ताकि वे के लिए आसान होता है sedसे निपटने के लिए। मैं करने की उम्मीद कर रहा था और सभी sedजवाब देंगे, लेकिन यह तरीका सरल और आसान है।

उदाहरण:

$ ./sylabify.sh <<< "diaspora nickel sister dragon hello world have a nice day pour some nickel and xenon there paying tricks quicksilver"
di-as-po-ra nick-el sis-ter dra-gon hel-lo world have a nice day pour some nick-el and xe-non the-re pay-ing tricks qu-ic-ksil-ver $ 

अर्घ, मैं नियम 3 को भूल गया हूँ। यह ठीक है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.