ইংরেজি শব্দ সিলেক্ট - ধরনের


11

আপনাকে এমন একটি প্রোগ্রাম লেখার দায়িত্ব দেওয়া হয়েছে যা হাইফেন দিয়ে আলাদা করে পাঠ্যের স্ট্রিংয়ে শব্দের সংক্ষিপ্ত বিবরণ দেয়। এটি অনেক কাজ হবে, সুতরাং আপনি কিছু অংশ ছেড়ে যেতে চান, প্রধানত কারণ আপনি নিখুঁত অ্যালগরিদমের জন্য প্রয়োজনীয় উচ্চারণগুলির একটি টেবিল রাখতে চান না। এই অ্যাসাইনমেন্ট দেওয়ার প্রতিশোধ হিসাবে আপনি এটিকে যথাসম্ভব সংক্ষিপ্ত (এবং এইভাবে অপঠনযোগ্য এবং অভাবনীয়) করতেও চান।

আপনার দুটি পছন্দ আছে:

  • এমন একটি প্রোগ্রাম লিখুন যা STDIN থেকে স্ট্রিং নেয় এবং ফলাফলটি STDOUT এ আউটপুট করে।
  • একটি ফাংশন লিখুন যা একক প্যারামিটার হিসাবে স্ট্রিং নেয় এবং ফলাফলটি দেয় returns

সবিস্তার বিবরণী

  • এই ক্ষেত্রে, স্ট্রিং মানে আপনার পছন্দের ভাষাতে কোনও স্ট্রিং-জাতীয় নির্মাণ (বাইট অ্যারে, চরিত্রের অ্যারে, স্ট্রিং ...)।
  • স্বর হয় 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 এর জন্য রেফারেন্স?
জন ডিভোরাক

@ জনডভোরাক "যখন কোনও শব্দ বিভক্ত হয় তখন শব্দের ডান অর্ধেক দিয়ে আবার শুরু করুন" "এর পরে নিয়ম # 6।
seequ

আমি বোঝাতে চাইছি, # 4 কেবলমাত্র সিলেবলের মধ্যে বিভক্ত হওয়া উচিত?
জন ডিভোরাক

1
নিয়ম # 1 চারটি অক্ষরের শব্দের সাথে কাজ করে। চার অক্ষরের কম শব্দযুক্ত কী হবে? যেমনlua
ডিজিটাল ট্রমা

1
@ ডিজিটালট্রামা এগুলি সাধারণত প্রক্রিয়াজাত হয় তবে খুব কমই দুটি সিলেবল থাকে।
seequ

উত্তর:


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 এড়িয়ে যায় (শুরুতে "সিকে" সহ একটি স্বরযুক্ত শব্দ না থাকলে এটি প্রয়োজন হয় না), এবং বাকী # এর আগে সিকি এবং ওয়াই বিধিগুলি অতিক্রম করা হয় 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


আমার কাছে রুবি নেই, তবে এটি সত্যিই ঠিক আছে।
seequ

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শুরু ও পাইপলাইন শেষে গুলি শব্দ NEWLINE বিভাজিত করা, যাতে তারা জন্য সহজ 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 পরিবর্তিত হয়েছে। এটা ভাল.
seequ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.