কোড গল্ফ: ইংলিশ পার্স করে একটি নাইটস এবং ক্যানভেস লজিক সমস্যা সমাধান করুন


16

পটভূমি

বিল এবং জন দুজন লোক আছেন। তার মধ্যে একটি নাইট, যা সর্বদা সত্য বলে, এবং অন্যটি একটি ছুরি, যা সর্বদা মিথ্যা বলে। আপনি জানেন না কে নাইট আর কে ছুরি। তারপরে প্রত্যেক ব্যক্তি কারা ছুরি এবং নাইট সে সম্পর্কে বিভিন্ন বিবৃতি দেয়। এই তথ্যটি ব্যবহার করে, আপনাকে অবশ্যই সিদ্ধান্তে পৌঁছাতে হবে যে নাইট কে এবং কারা ছুরি।

নাইট এবং Knaves যুক্তিবিজ্ঞান সমস্যা Booleen বীজগণিত উপর ভিত্তি করে। একজন ব্যক্তি যে শব্দগুলি বলেছেন সেগুলি বুলিন সন্তোষজনকতার সমস্যা তৈরি করে। ছুরির বক্তব্য অবশ্যই সর্বদা মিথ্যা এবং অন্য নাইটের বক্তব্য অবশ্যই সর্বদা সত্য হওয়া উচিত।

জন বলেছেন "আমি দুজনেই ছুরি এবং বিল হ'ল ছুরি"। জন যদি নাইট হত তবে এই উক্তিটি মিথ্যা হবে, সুতরাং সে নাইট হতে পারে না। তিনি যদি ছুরি এবং বিল নাইট হন তবে এই বিবৃতিটি এখনও মিথ্যা হবে, এমনকি প্রথম অংশটি সত্য বলেও ভাবা হয়েছিল। সুতরাং, জন ছুরি।

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি হ'ল সংক্ষিপ্ততম প্রোগ্রামটি লেখার জন্য যা প্রতিটি ব্যক্তির দেওয়া বিবৃতিগুলির একটি তালিকা নেবে এবং কে ছুরি এবং কে নাইট তা নির্ধারণ করবে। কভার করার জন্য অনেকগুলি বিবরণ রয়েছে, সুতরাং এই সমস্যাটি তিনটি বিভাগে বর্ণিত।

ইনপুট

ইনপুট দুটি লাইনের পরে একটি নতুন লাইন হবে। প্রতিটি লাইন একটি চরিত্রের নাম দেবে, তার পরে একটি কোলন থাকবে, তারপরে সেই ব্যক্তির দ্বারা বর্ণিত বিভিন্ন বাক্য থাকবে। যদি কোনও ব্যক্তি নাইট হয়, তবে তার সমস্ত বাক্য সত্য হবে এবং ছুরিটির সমস্ত বাক্যই মিথ্যা হবে। একটি বাক্যের প্রথম অক্ষর সর্বদা মূলধন করা হবে এবং প্রতিটি বাক্য একটি সময়ের সাথে শেষ হবে। এখানে একটি উদাহরণ:

Joe: Both I am a knight and neither Steve is a knave nor I am a knave.
Steve: Joe is a knave. Either Joe is a knight or I am a knight.

পদান্বয়

প্রতিটি বাক্যে কমপক্ষে একটি ধারা থাকে। প্রতিটি অনুচ্ছেদে কয়েকটি জিনিসের একটি রয়েছে (আশা করি আপনি আমার স্বরলিপিটি বুঝতে পারেন):

both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]

এটি স্পষ্টতই এটি পোলিশ স্বরলিপির সাথে সমান উপায়ে বোঝা যায়। এখানে একটি বাক্য উদাহরণ:

Both I am a knight and neither Steve is a knave nor I am a knave.

বুলিয়ান বীজগণিত অনুবাদ সহজ সরল। "উভয়" বিবৃতিগুলি ANDs, "উভয়" বিবৃতিটি XORs, এবং "উভয়ই" বিবৃতিগুলি NORs নয়।

(I am a knight) AND ((Steve is a knave) NOR (I am a knave))

আউটপুট

আউটপুট দুটি লাইন নিয়ে গঠিত। প্রতিটি লাইনে একটি ব্যক্তির নাম থাকে (ক্রমানুসারে) এবং তারপরে সে নাইট বা ছুরি কিনা তা বলে। সর্বদা একটি নাইট এবং একটি ছুরি থাকবে। উপরের উদাহরণের জন্য আউটপুট এখানে দেওয়া হল:

Joe is the knave.
Steve is the knight.

যদি সমস্যাটি অলসযোগ্য হয় (তবে আপনি যা বলতে পারেন তা কোনটি নয়, বা এর কোনও সমাধান নেই), তবে আপনার প্রোগ্রামটি বৈধ আউটপুট উত্পাদনের জন্য এক্সসেসিপি কিছু করতে পারে।

আরও উদাহরণ

ইনপুট

Sir Lancelot: Either both I am a knight and Merlin is a knave or both I am a knave and Merlin is a knight.
Merlin: Either both I am a knight and Sir Lancelot is a knight or both I am a knave and Sir Lancelot is a knave.

আউটপুট

Sir Lancelot is the knight.
Merlin is the knave.

ইনপুট

David: Neither I am a knave nor Patrick is a knight. Either I am a knight or Patrick is a knave.
Patrick: Either I am a knight or both I am a knight and David is a knight.

আউটপুট

David is the knave.
Patrick is the knight.

ইনপুট

Lizard: I am a knight.
Spock: I am a knave.

একটি সম্ভাব্য আউটপুট

Rock Paper Scissors

বিধি, প্রবিধান এবং নোট

  1. স্ট্যান্ডার্ড কোড গল্ফ বিধি প্রযোজ্য
  2. আপনার প্রোগ্রামটি কেবল প্রিন্টযোগ্য এএসসিআইআই দিয়ে তৈরি করা উচিত
  3. সমস্ত ইনপুট এবং আউটপুট STDIN এবং STDOUT থেকে হবে

কেস সংবেদনশীলতা সম্পর্কে কি? আপনার সিনট্যাক্সের বর্ণনা ছোট হাতের অক্ষর, আপনার উদাহরণগুলি বড় হাতের। ক্ষেত্রে সংবেদনশীলতা একটি প্রয়োজনীয়তা?
ugoren

প্রতিটি প্রেরণের প্রথম চিঠিটি মূলধন করা হবে, তবে কেবলমাত্র নামগুলি মূলধন করা হবে। আপনি কোন নির্দিষ্ট সমস্যাটি দেখছেন?
PhiNotPi

যেহেতু আপনি যথাযথ ইংরেজি মূলধন ব্যবহার করেন, উভয় / উভয় / উভয়ই প্রথম অক্ষর প্রসঙ্গে নির্ভর করে। আমি অনুমান করি যে এটি মোকাবেলা করার সহজ উপায় হ'ল কেস-সংবেদনশীল হওয়া।
ugoren

উত্তর:


6

পাইথন, 491 অক্ষর

প্রতিটি লাইনকে পাইথন এক্সপ্রেশনে রূপান্তর করে এবং তা বর্ধিত করে কাজ করে।
ছুরি এবং নাইটকে 0 এবং 1 হিসাবে মূল্যায়ন করা হয় দু'জনের জন্য, আমরা উভয় বিকল্প চেষ্টা করে দেখি।
উদাহরণস্বরূপ, Joe: Steve is a knaveহয়ে যায় Joe==(Steve==knave)। এইভাবে, যদি Joeকোনও ছুরি হয় তবে ফলাফলটি সত্য যদি তিনি মিথ্যা বলে থাকেন তবেই সত্য।
যখন আপনি অসম্ভব বা অনিশ্চিত হন তখন আপনি কুরুচিপূর্ণ ত্রুটি পান। যদি অসম্ভব হয় তবে r[0]এটি একটি সূচক ত্রুটি, কারণ rএটি খালি। যদি অনস্বীকার্য হয় তবে r[1:]স্ট্রিংগুলির তালিকার সাথে যুক্ত হয়ে সমস্যা তৈরি করে।

import sys
def p():
    a=s.pop(0)
    try:return{"both":"(%s*%s)","either":"(%s|%s)","neither":"(1-(%s|%s))"}[a.lower()]%(p(),p())
    except KeyError:r=s[2];del s[:4];return"(%s==%s)"%((a,m)[a=="I"],r)
x=[];w=[]
for l in sys.stdin:
    m,l=l.split(":");w+=[m]
    for s in l.split("."):
        s=s.split()
        while s:x+=["%s==%s"%(m,p())]
k=("knave","knight")
r=[a for a in[{w[0]:z,w[1]:1-z}for z in(0,1)]if all(eval(l,{k[0]:0,k[1]:1},a)for l in x)]
print"\n".join(x+" is the "+k[r[0][x]]+"."for x in w+r[1:])

3

রুবি, 352 টি অক্ষর

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

q=->{gets.split /: |\.\s/}
C,*E=q[]
D,*F=q[]
r=->c,m{t=c.shift;t[1]?(x=r[c,m];c.shift;y=r[c,m];t[0]==?B?x&y :t[0]==?E?x^y :1-(x|y)):(c.shift(2);h=c.shift[2]==?I?m : 1-m;t==?I?h :1-h)}
s=->u,v,b{u.map{|c|r[c.gsub(v,?J).upcase.split,b]==b}.all?}
t=->b{s[E,D,b]&&s[F,C,1-b]}
u=->v,b{v+" is the kn#{b ?:ight: :ave}."}
puts t[1]^t[0]&&u[C,t[1]]+$/+u[D,t[0]]

আপনি আউটপুটে পিরিয়ডগুলি ছেড়ে দিবেন বলে মনে হচ্ছে তবে এটি দুটি চরিত্রের স্থির মতো মনে হচ্ছে।
PhiNotPi

1
@ ফিলনটপিপি হয়ে গেছে একটি শূন্য-চরিত্রের
হাওয়ার্ড

0

পার্ল - 483 বাইট

(($a,$b),($c,$d))=map{split':'}@ARGV;$h='y';$i='x';$s=' is the kn';$g='ight.';$v='ave.';for($b,$d){$_.=' 1';s/ am a | is a /==/g;s/knight/1)/g;s/knave/0)/g;s/I=/(\$$i=/g;s/($a|$c)=/(\$$h=/g;s/([^.]+)\./($1)and/g;s/ or / xor /g;s/ nor / or /g;while(s/(?<= )(\w+ \((?:[^()]+|(?1))\) \w+ \((?:[^()]+|(?1))\))/($1)/g){}s/neither/!/gi;s/both|either//gi;$h=$i++}$x=0;$y=1;$k=!eval($b)&&eval($d);$x=$y--;$n=!eval($d)&&eval($b);print"$a$s$v
$c$s$g"if($k&&!$n);print"$a$s$g
$c$s$v"if($n&&!$k)

পাইথন সমাধানের মতো। এটি পার্ল কোডে বাক্যগুলি হ্রাস করে এবং evalসেগুলি এর পরে । ইনপুটটি অদ্ভুত থাকলে এটি প্রায়-বৈধ আউটপুট মুদ্রণ করতে পারে তবে তা অনিদ্রাব্য যদি কিছু প্রিন্ট না করে। সুগঠিত ইনপুট আশানুরূপভাবে কাজ করে। বাক্যগুলি উদ্ধৃতিগুলির অভ্যন্তরে কমান্ড লাইনে দেওয়া হয় এবং কোনও বিশেষ পতাকা লাগানোর প্রয়োজন হয় না।

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