আজেবাজে পূর্ণ বই: লাইম্রিকগুলি শনাক্ত করুন


15

যেমনটি আমরা সকলেই জানি, লাইব্রিকগুলি সংক্ষিপ্ত, পাঁচ-লাইন, মাঝে মাঝে একটি এএবিবিএ রাইমিং স্কিম এবং একটি অ্যানাপেস্টিক মিটার (যা কিছু হোক না কেন) সহ কবিতাযুক্ত কবিতা:

একটি লিমেরিকের অযৌক্তিক
লাইনটি লিখুন এবং শব্দটির সাথে পাঁচটি ছড়াটি লিখুন
এবং ঠিক যেমন আপনি গণনা করেছেন
তারা দ্বিতীয়টির সাথে ছড়াবেন
চতুর্থ লাইনে অবশ্যই তৃতীয়টির সাথে ছড়াটি করা উচিত

আপনাকে সংক্ষিপ্ততম প্রোগ্রামটি লেখার দায়িত্ব দেওয়া হয়েছে যা যখন কোনও ইনপুট পাঠ্য খাওয়ানো হয় তখন এটি কী মনে করে যে ইনপুটটি একটি বৈধ লিমেরিক। ইনপুট হয় কমান্ড লাইনে বা স্ট্যান্ডার্ড ইনপুট দিয়ে আপনার বিকল্পে থাকতে পারে, এবং আউটপুট হয় সাধারণ "Y" / "এন" বা একটি আত্মবিশ্বাস স্কোর হতে পারে, আবার আপনার বিকল্পে।

এখানে সঠিক লাইম্রিকের আরও একটি উদাহরণ রয়েছে:

একজন যুবতী মহিলা ছিলেন যার চোখ
বর্ণ এবং আকারের তুলনায় অনন্য ছিল
যখন সে তাদের প্রশস্ত খুলল
লোকেরা সমস্ত দিকে মুখ ফিরিয়েছিল
এবং অবাক হয়ে দূরে সরে গিয়েছিল

কিন্তু নিচে কবিতা পরিষ্কারভাবে হয় না , একটি লিমেরিক যেহেতু এটি মিত্রাক্ষর কবিতা নয়:

সেন্ট বীসের একজন বৃদ্ধ লোক
ছিলেন, যাকে একটা বাড়া দিয়ে বাহুতে চাপানো হয়েছিল।
যখন জিজ্ঞাসা করা হয়, "এটি ব্যাথা করে?"
তিনি জবাব দিয়েছিলেন, "না, তা হয় না,
আমি এত আনন্দিত যে এটি শিংকামাটি ছিল না।"

মিটারটিও যেহেতু ভুল, তেমনি এটিও নয়:

আমি বার্লিনের এক ব্যক্তির কথা শুনেছি
যার ঘরে সে ছিল ঘৃণা,
যখন আমি জিজ্ঞাসা করলাম কেন
সে দীর্ঘশ্বাস ফেলে বলবে:
"আচ্ছা, আপনি দেখুন, গতরাতে চারপাশে দু'জন হুডলম ছিল যারা বিয়ার্সকে বিজয়ী করে উদযাপন করছিল? বিশ্বকাপ, এবং তারা সত্যই উচ্চস্বরে ছিল তাই ডিনের কারণে আমি ঘুমাতে পারিনি ""

প্রাদান

আপনার ইনপুটটি লিমেরিক কিনা তা নির্ধারণের জন্য আপনি কিছু ক্লু ব্যবহার করতে পারেন:

  • লাইম্রিকগুলি সর্বদা পাঁচ লাইন দীর্ঘ।
  • 1, 2 এবং 5 লাইনের ছড়া উচিত।
  • লাইন 3 এবং 4 ছড়া উচিত।
  • লাইন 1, 2 এবং 5 এর প্রায় 3x3 = 9 উচ্চারণ রয়েছে, তৃতীয় এবং চতুর্থটিতে 2x3 = 6 অক্ষরেখা রয়েছে

মনে রাখবেন যে প্রথম ব্যতীত এগুলির কোনওটিই কঠোর এবং দ্রুত নয়: একটি 100% নির্ভুলতার রেটিং অসম্ভব।

বিধি

  • আপনার এন্ট্রি খুব কমপক্ষে সঠিকভাবে উদাহরণস্বরূপ ফ্যাশনের 1 থেকে 3 পর্যন্ত উদাহরণগুলিতে শ্রেণীবদ্ধ করা উচিত ।

  • আপনি হয় , অবশ্যই প্রোগ্রামিং ভাষায় বিশেষভাবে (দেখুন এই প্রতিযোগিতার জন্য ডিজাইন করা ছাড়া কোনো প্রোগ্রামিং ভাষা আপনি চান ব্যবহারের অনুমতি এখানে )।

  • আপনি নেই আপনার প্রোগ্রামিং ভাষা এর স্ট্যান্ডার্ড অর্ঘ ব্যতীত কোনো লাইব্রেরি ব্যবহার করার অনুমতি দেওয়া।

  • আপনি হয় যে অনুমান করা অনুমতি দেওয়া এই ফাইলটি , CMU স্পিংক্স pronounciation অভিধান, বর্তমান ডিরেক্টরির মধ্যে নামক 'গ' একটি ফাইল আছে।

  • তুমি না পরীক্ষা ইনপুট জন্য হার্ড কোড করার অনুমতি দেওয়া: আপনার প্রোগ্রাম একটি সাধারণ লিমেরিক categorizer হওয়া উচিত।

  • আপনি হয় , অনুমান করা যে ইনপুট হওয়া ASCII হয় মঞ্জুরিপ্রাপ্ত কোনো বিশেষ বিন্যাস ছাড়া (উদাহরণ মত), কিন্তু আপনার প্রোগ্রাম interpunction দ্বারা নয় বিভ্রান্ত হবে।

বোনাসেস

নিম্নলিখিত বোনাস উপলব্ধ:

  • আপনার প্রোগ্রাম লিমেরিক হিসাবে তার ফলাফল আউটপুট? 150 অক্ষরের দৈর্ঘ্যের বোনাস বিয়োগ করুন !
  • আপনার প্রোগ্রামটি সঠিকভাবে সনেটগুলি সনাক্ত করে? 150 অক্ষর অতিরিক্ত দৈর্ঘ্যের বোনাস বিয়োগ করুন !
  • আপনার প্রোগ্রামটি যখন সনেটে ব্যবহৃত হয় তখন তার ফলস্বরূপ একটি সনেট হিসাবে ফলাফল হয়? 100 টি অতিরিক্ত অতিরিক্ত দৈর্ঘ্যের বোনাস বিয়োগ করুন !

অবশেষে ...

আপনার কোন বোনাস আপনার প্রাপ্য বলে মনে করবেন তা যদি মনে করেন তবে তা উল্লেখ করুন এবং আপনার স্কোর এ পৌঁছানোর জন্য আপনার অক্ষরের সংখ্যা থেকে বোনাসটি বিয়োগ করুন। এটি একটি কোড গল্ফ প্রতিযোগিতা: স্বল্পতম এন্ট্রি (অর্থাত্ সর্বনিম্ন স্কোর সহ এন্ট্রি) জিতেছে।

আপনার যদি আরও (ধনাত্মক) পরীক্ষার ডেটা প্রয়োজন হয় তবে ওইডিআইএলএফ বা বুক অফ ননসেন্সটি দেখুন । নেতিবাচক পরীক্ষার ডেটা তৈরি করা সহজ হওয়া উচিত।

শুভকামনা!


এটি code-challengeবোনাসগুলির কারণে হওয়া উচিত । দয়া করে ট্যাগ বিবরণ পড়ুন
ব্যবহারকারী 80551

2
@ ব্যবহারকারী 80551 মেটা সম্পর্কিত sensকমত্য অন্যথায় উপস্থিত হতে পারে।
ডুরকনব

আমি বোনাসগুলির প্রকৃতিটি পরিষ্কার করে দিয়েছি, আমি আশা করি যে এই বিভ্রান্তি দূর হবে।
Wander Nauta

2
গুহুও ভাল্লুক!
অ্যালভোনেলোস

আমি বোনাস বুঝতে পারি না। আমি কীভাবে লাইম্রিকের আকারে "ওয়াই" আউটপুট দেব?
r3mainer

উত্তর:


8

পাইথন: 400 - 150 - 150 = 100

আমি যে সংক্ষিপ্ততম স্ক্রিপ্টটি নিয়ে আসতে পারি তা হ'ল ...

import re,sys;f,e,c=re.findall,lambda l,w:f('^'+w.upper()+'  (.+)',l),lambda*v:all([a[i]==a[v[0]]for i in v]);a=[sum([[e(l,w)[0].split()for l in open('c')if e(l,w)][0]for w in f(r'\w+',v)],[])[-2:]for v in sys.stdin];n=len(a);print n==14and c(0,3,4,7)*c(1,2,5,6)*c(8,11)*c(9,12)*c(10,13)*"Sonnet"or"For a critic\nOf limerick\nWell-equipped\nIs this script.\n%s limerick!"%(n==5and c(0,1,4)and c(2,3))

... তবে চেষ্টাও করবেন না। এটি প্রতিটি শব্দের সাথে মিলিত প্রদত্ত অভিধানটিকে পার্স করে, এইভাবে খুব ধীর হয়। এছাড়াও, একটি শব্দ অভিধানে না থাকলেও একটি ত্রুটি তৈরি হয়।

কোডটি এখনও প্রয়োজনীয়গুলি পূরণ করে: পাঠ্যটি দিয়ে গেছে কিনা তা স্বীকার করে স্টিডিনের লাইম্রিক, সোননেট বা সেগুলির কোনওটিরই নয় করে।

আরও 20 টি অক্ষর সহ, এখানে অনুকূলিত সংস্করণটি রয়েছে:

import re,sys;f,e,c=re.findall,lambda l:f(r'^(\w+)  (.+)',l),lambda*v:all([a[i]==a[v[0]]for i in v]);d={e(l)[0][0]:e(l)[0][1].split()for l in open('c')if e(l)};a=[sum([d.get(w.upper(),[])for w in f(r'\w+',v)],[])[-2:]for v in sys.stdin];n=len(a);print n==14and c(0,3,4,7)*c(1,2,5,6)*c(8,11)*c(9,12)*c(10,13)*"Sonnet"or"For a critic\nOf limerick\nWell-equipped\nIs this script.\n%s limerick!"%(n==5and c(0,1,4)and c(2,3))

বৈশিষ্ট্য

  • সনেটগুলি চিনতে সক্ষম (-150)
  • লাইম্রিকের সাথে চুনকির উত্তর (-150)
  • তুলনামূলকভাবে দ্রুত: এক্সিকিউশন অনুযায়ী কেবল একটি ফাইল পার্সিং

ব্যবহার

cat poem.txt | python poem-check.py

3 বিভিন্ন আউটপুট সম্ভব:

  • লিমেরিক বলছে ইনপুটটি যদি হয় তবে তা হয়
  • লিমেরিক বলছে ইনপুটটি যদি হয় না তবে এটি এক নয়
  • "সনেট" যদি ইনপুটটি এরূপ হিসাবে স্বীকৃত হয়

ব্যাখ্যা সহ প্রসারিত কোড code

import re, sys

# just a shortened version of the 're.findall' function...
f = re.findall
# function used to parse a line of the dictionary
e = lambda l:f(r'^(\w+)  (.+)', l)

# create a cache of the dictionary, where each word is associated with the list of phonemes it contains
d = {e(l)[0][0]:e(l)[0][1].split(' ') for l in open('c') if e(l)}

# for each verse (line) 'v' found in the input 'sys.stdin', create a list of the phoneme it contains;
# the result array 'a' contains a list, each item of it corresponding to the last two phonemes of a verse
a = [sum([d.get(w.upper(), []) for w in f(r'\w+',v)],[])[-2:] for v in sys.stdin]

# let's store the length of 'a' in 'n'; it is actually the number of verses in the input
n = len(a)
# function used to compare the rhymes of the lines which indexes are passed as arguments
c = lambda*v:all([a[i] == a[v[0]] for i in v])

# test if the input is a sonnet, aka: it has 14 verses, verses 0, 3, 4 and 7 rhyme together, verses 1, 2, 5 and 6 rhyme together, verses 8 and 11 rhyme together, verses 9 and 12 rhyme together, verses 10 and 13 rhyme together
if n==14 and c(0,3,4,7) and c(1,2,5,6) and c(8,11) and c(9,12) and c(10,13):
    print("Sonnet")
else:
    # test if the input is a limerick, aka: it has 5 verses, verses 0, 1 and 4 rhyme together, verses 2 and 3 rhyme together
    is_limerick = n==5 and c(0,1,4) and c(2,3)
    print("For critics\nOf limericks,\nWell-equipped\nIs this script.\n%s limerick!", is_limmerick)

শান্ত দেখায়! আমি এটি এখনও পরীক্ষা করি নি, তবে আপনি কি নিশ্চিত যে এটি "কমান্ড লাইনে বা স্ট্যান্ডার্ড ইনপুট মাধ্যমে" ইনপুট নেবে (প্রশ্ন দেখুন)? যদি তা না হয় তবে আপনার এটি যোগ করা উচিত (সম্ভবত একটি sys.stdin.read()বা open(sys.argv[1]).read()অন্য কোথাও) এবং পুনঃসংখ্যক।
21-15:

ঠিক আছে! এটি সংশোধন করা হয়েছে :)
ম্যাথিউ রডিক

ছড়াগুলি কীভাবে আলগোরিদিম চেক করে?
ডেভিডসি

প্রশ্নে ওয়ান্ডার নওতার দেওয়া ফাইলটির সাহায্যে! এটা সত্যিই সাহায্য করেছে।
ম্যাথিউ রডিক

1
ঝরঝরে! একটা লজ্জা আমি তোমাকে দুবার উজ্জীবিত করতে পারি না।
নুটা

2

ECMAScript 6 (138 পয়েন্ট; ফায়ারফক্সে চেষ্টা করুন):

288- 150লিমেরিক অন্তর্ভুক্ত করার জন্য পয়েন্ট বোনাস (@ ম্যাথিউরডিক থেকে চিটযুক্ত)।

a=i.split(d=/\r?\n/).map(x=>x.split(' '));b=/^\W?(\w+) .*? (\w+\d( [A-Z]+)*)$/;c.split('\r\n').map(x=>b.test(x)&&eval(x.replace(b,'d["$1"]="$2"')));e=f=>d[a[f][a[f].length-1]];alert('For critics\nOf limericks,\nWell-equipped\nIs this script.\n'+(a[4]&&e(0)==e(1)&e(0)==e(4))+' limerick!')

মন্তব্য:

পরিবর্তনশীল আশা করে c অভিধান ফাইলের বিষয়বস্তু ধারণ করে বলে যেহেতু আপনি সরল ECMAScript এ ফাইলগুলি পড়তে পারেন না।

ইসমাস্ক্রিপ্টের স্ট্যান্ডার্ড ইনপুট নেই, তবে promptসাধারণত "স্ট্যান্ডার্ড ইনপুট" হিসাবে বিবেচিত হয়; তবে, promptবেশিরভাগ (সমস্ত না থাকলে) ব্রাউজারগুলিতে ফাঁকা ফাঁকে ফাঁকে রূপান্তরকারী হিসাবে , আমি পরিবর্তনশীল থেকে ইনপুট গ্রহণ করছি i

অবরুদ্ধ কোড:

// If you paste a string with multiple lines into a `prompt`, the browser replaces each line break with a space, for some reason.
//input = prompt();

// Split into lines, with each line split into words
lines = input.split('\n').map(x => x.split(' '));

dictionaryEntryRegEx = /^\W?(\w+) .*? (\w+\d( [A-Z]+)*)$/;
dictionary = {};
// Split it into
c.split(/\r?\n/).map(x => dictionaryEntryRegEx && eval(x.replace(dictionaryEntryRegEx, 'dictionary["$1"] = "$2"')));

// Get the last word in the line
getLastWordOfLine = (lineNumber) => dictionary[line[lineNumber][line[lineNumber].length - 1]]

alert('For critics\nOf limericks,\nWell-equipped\nIs this script.\n' + (lines[4] && getLastWordOfLine(0) === getLastWordOfLine(1) && getLastWordOfLine(0) === getLastWordOfLine(4)) + ' limerick!');

ঝরঝরে! এটি 'কমান্ড লাইনে বা স্ট্যান্ডার্ড ইনপুট মাধ্যমে' ইনপুট নেয় না, যদিও এই প্রশ্নের প্রয়োজন। হতে পারে আপনি এটি নোড.জেএস বা অন্য কিছু ব্যবহার করতে আবার লিখতে পারেন।
নাউটা

@ ওয়ান্ডারনৌটা আপনাকে ধন্যবাদ আমি কেন স্ট্যান্ডার্ড ইনপুট ব্যবহার করছি না তা ব্যাখ্যা করার সাথে সাথে সর্বশেষতম সম্পাদনাটি দেখুন ।
টুথব্রাশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.