শূকরগুলি কি উড়তে সক্ষম?


45

কার্য

আপনার কাজটি হ'ল আপনার পছন্দের ভাষায় একটি ফাংশন বা একটি প্রোগ্রাম লিখুন যা কয়েকটি বিবৃতি বিশ্লেষণ করে এবং শূকরগুলি উড়তে সক্ষম এমন বিবৃতিগুলি থেকে সিদ্ধান্তে পৌঁছানো যায় কিনা তা নির্ধারণ করে।

ইনপুট

ইনপুটটি এমন একটি স্ট্রিং যা এসটিডিএন থেকে পড়া যায়, একটি ফাংশন আর্গুমেন্ট হিসাবে নেওয়া বা এমনকি কোনও ফাইলে সংরক্ষণ করা যায়। নিম্নলিখিত EBNF ব্যবহার করে ইনপুটটি বর্ণনা করা যেতে পারে:

input = statement , {statement};
statement = (("Pigs are ", attribute) | ("Everything that is ", attribute, "is also ", attribute)), ". ";
attribute = [not], ("able to fly" | singleAttribute);
singleAttribute = letter, {letter};
letter = "a" | "b" | "c" | "d" | "e" | "f" | "g"
       | "h" | "i" | "j" | "k" | "l" | "m" | "n"
       | "o" | "p" | "q" | "r" | "s" | "t" | "u"
       | "v" | "w" | "x" | "y" | "z" ;

উদাহরণ ইনপুট (নীচে আরও উদাহরণ দেখুন):

Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent. Pigs are sweet. 

আউটপুট

আউটপুট আপনার ফাংশন দ্বারা ফিরে আসতে পারে, একটি ফাইলে লেখা বা STDOUT এ মুদ্রণ করা যাবে। হ্যান্ডেল করার জন্য এখানে 5 টি পৃথক মামলা রয়েছে:

  1. প্রদত্ত বিবৃতিগুলি বৈধ, সামঞ্জস্যপূর্ণ এবং শূকরগুলি উড়তে পারে এমন যৌক্তিক পরিণতি হিসাবে রয়েছে। সেক্ষেত্রে আপনাকে অবশ্যই আউটপুট দিতে হবে Yes
  2. প্রদত্ত বিবৃতিগুলি বৈধ, সামঞ্জস্যপূর্ণ এবং লজিক পরিণতি হিসাবে শূকরগুলি উড়তে পারে না। সেক্ষেত্রে আপনাকে অবশ্যই আউটপুট দিতে হবে No
  3. শূকরগুলি উড়তে পারে কি না তা প্রদত্ত, বৈধ এবং ধারাবাহিক বিবৃতি থেকে শেষ করা যায় না। সেক্ষেত্রে আপনাকে অবশ্যই আউটপুট দিতে হবে Maybe
  4. প্রদত্ত বিবৃতিগুলি বৈধ, তবে সামঞ্জস্যপূর্ণ নয় (যেমন প্রদত্ত বিবৃতিগুলির মধ্যে একটি বৈপরীত্য রয়েছে)। যেহেতু প্রাক্তন falso quodlibet , আমরা আউটপুট করার সিদ্ধান্ত নেন Yesযে ক্ষেত্রে।
  5. প্রদত্ত বিবৃতিগুলি বৈধ নয়, অর্থাৎ প্রদত্ত EBNF অনুযায়ী সেগুলি বিন্যাস করা হয়নি। সেক্ষেত্রে আপনি যা চান তা করতে পারেন।

বিস্তারিত

  • আপনি ধরে নিতে পারেন যে প্রদত্ত গুণাবলী একে অপরের থেকে স্বতন্ত্র। সুতরাং, উদাহরণস্বরূপ, কোনও শূকর কোনওরকম অসঙ্গতি সৃষ্টি না করে একই সময়ে অল্প বয়স্ক এবং বৃদ্ধ, সবুজ, লাল এবং নীল হতে পারে। তবে, একই সাথে একটি শূকরটি 'সবুজ' এবং 'সবুজ নয়' হতে পারে, এটি একটি বৈপরীত্য এবং এটি বর্ণিত হিসাবে পরিচালনা করা উচিত (4)।
  • প্রতিটি বৈশিষ্ট্যের জন্য, ধরে নিন যে মহাবিশ্বে কমপক্ষে একটি বস্তু রয়েছে (অগত্যা একটি শূকর নয়) যা প্রদত্ত বৈশিষ্ট্য রয়েছে এবং একটি বস্তু যা এটি নেই।

উদাহরণ ইনপুট এবং আউটপুট

ইনপুট:

Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent. 

আউটপুট: যেহেতু শূকরগুলি সবুজ এবং তাই বুদ্ধিমান এবং যে সমস্ত জিনিস উড়তে সক্ষম তা বুদ্ধিমান নয়, শূকরগুলি উড়তে পারে না। আউটপুট হয় No

ইনপুট:

Pigs are old. Everything that is not able to fly is also not old. 

আউটপুট: শূকরগুলি যদি উড়তে সক্ষম না হয় তবে তাদের বয়সও ছিল না। তবে এগুলি বৃদ্ধ হিসাবে, আপনাকে অবশ্যই আউটপুট করতে হবে Yes

ইনপুট:

Everything that is sweet is also not old. Everything that is intelligent is also blue. 

আউটপুট: Maybe

ইনপুট:

Pigs are not able to fly. Everything that is red is also sweet. Everything that is sweet is also not red. 

আউটপুট: যদিও প্রথম বিবৃতি সূচিত করে যে শূকরগুলি উড়তে পারে না, নিম্নলিখিত বিবৃতিগুলি একে অপরের সাথে বিরোধিতা করে এবং তাই আউটপুট অবশ্যই হওয়া উচিত Yes

ইনপুট:

Pigs are very smart. Pigs are able to fly. 

আউটপুট: স্ট্রিং উপরে বর্ণিত মানদণ্ডের সাথে মেলে না বলে আপনি যা চান তাই করুন।

বিজয়ী

এটি , তাই সংক্ষিপ্ত সঠিক উত্তর (বাইটে) জেতে। প্রথম সঠিক উত্তর পোস্ট হওয়ার এক সপ্তাহ পরে বিজয়ী নির্বাচন করা হবে।

একটি উড়ন্ত পিগ


তৃতীয় উদাহরণ হ্যাঁ ফিরে আসে কেন?
xem

10
আমি একটি উত্তর লিখতে বিবেচনা করছি যা প্রোলগ কোডে ইনপুটটি অনুবাদ করে।
তাল

1
আপনি কেবল এই সিদ্ধান্তে পৌঁছাতে পারবেন যে লাল কিছুই নেই। মিষ্টি, নন-রেড জিনিসগুলি ভাল।
ব্যবহারকারী 2357112

1
আমি আরও উদাহরণের জন্য আশা করছিলাম, কেবল তাই আমি সেগুলি নিজেই করতে পারি।
সিজেফুরে

1
@ এক্সেম: প্রাক্তন ফ্লোসো কোডলিবিট, এটি উইকিপিডিয়াতে বিস্ফোরণের মূলনীতি হিসাবে দেখবেন। যদি কোনও বৈপরীত্য বিদ্যমান থাকে, তবে যে কোনও কিছু প্রমাণিত হতে পারে। সুতরাং 'godশ্বরের অস্তিত্ব' যদি সত্য হয় এবং 'godশ্বরের অস্তিত্ব থাকে না' সত্য, কোনও কিছু সত্য বলে দেখানো যেতে পারে, সুতরাং শূকরগুলি উড়তে পারে এটি সত্য প্রমাণিত হতে পারে।
ফাইটারগ্যামথিফ

উত্তর:


10

পার্ল, 363 353 350 347 343 297 266 264

$_=<>;s/able to fly/X/g;$m=' ?(not )?\b(P|\w+)';$h{$1?N.$2:$2}{$3?N.$4:$4}=$h{$3?$4:N.$4}{$1?$2:N.$2}=1while s/$m.{8}$m\.//;map{%x=0,r($_,$_)}%h;sub r{($a,$b)=@_;$e+=$h{$a}{N.$b};$x{$b}++or$h{$a}{$b}=1,map{r($a,$_)}%{$h{$b}}}print$e|$h{P}{X}?Yes:$h{P}{NX}?No:Maybe

Ungolfed / ব্যাখ্যা:

# Read one line from STDIN
$_=<>;
# Replaces special attribute with X
s/able to fly/X/g;
# Prepare attribute match
$m=' ?(not )?\b(P|\w+)';
# Match "Everything that is A is also B. "
#                        "\bA........ \bB\."
# Match "Pigs are B. "
#     "\bP........\bB\."
while(s/$m.{8}$m\.//)
{
  # Add facts for A => B and !B => !A, where A may equal "P" for "Pigs are"
  # Facts are stored as a hash of hashes %h; keys%h are the source attributes;
  # keys%{$h{$a}} are the attributes that follow from attribute $a
  # A "not attribute" is stored as "Nattribute", while a "attribute" is just stored as "attribute"
  $h{$1?N.$2:$2}{$3?N.$4:$4}=$h{$3?$4:N.$4}{$1?$2:N.$2}=1
}
# For all known source attributes ... (this should really be keys%h but we dont mind the extra hashrefs)
map{%x=0,r($_,$_)}%h;
sub r
{
  ($a,$b)=@_;
  # ... remember that we hit a negation and therefor an inconsistency ...
  # If we check/add $b and find an existing "N$b" that means that attribute $b is supposed to be true and not true at the same time
  # It is cheaper bytewise to just add up all consistency errors (remember each fact has a hard value of 1) than to exit right here
  $e+=$h{$a}{N.$b};
  # ... remember that we processed this attribute for the current source attribute so we prevent loops ...
  $x{$b}++or
  # ... add a new fact and then follow the chains (again omitting keys).
  $h{$a}{$b}=1,map{r($a,$_)}%{$h{$b}}
}
# Did we happen on an inconsistency? Do pigs fly? Dont pigs fly? Maybe (Bitwise or is okay too)
print$e|$h{P}{X}?Yes:$h{P}{NX}?No:Maybe

4
আপনি যদি এটি কীভাবে কাজ করে / কিছু মন্তব্য লিখতে পারেন তা যদি আমাদের বলতে পারতেন তবে দুর্দান্ত হবেন!
flawr

এবং আরও মন্তব্যগুলির জন্য আরেকটি আপভোট ... বিশেষত যে কোনও কিছুর আরও ব্যাখ্যা প্রয়োজন?
থাইলন

আরও মন্তব্য যুক্ত করা হয়েছে ...
থাইলন

@ অ্যালানবার্ট একটি পোস্টফিক্স দেওয়ার পরামর্শ দিয়েছিলেন। যেহেতু তিনি মন্তব্য করতে পারবেন না এবং আমি অনুমোদন করতে পারি না। আমি ধন্যবাদ বলতে চাই! এখানে.
থাইলন

10

হাস্কেল, 586 566 547 বাইট

আমি এই ধারণাটি নিয়ে লিখেছিলাম যে প্রতিটি সম্পত্তি পি এর জন্য অবশ্যই কিছু x এবং y থাকতে হবে যে পি (এক্স) সত্য এবং পি (y) মিথ্যা; এই অনুমান ব্যতীত, চতুর্থ উদাহরণ ইনপুটটির দ্বন্দ্ব হবে না এবং "না" এর উত্তর দেবে।

#define X p s q m
#define W where
t=0<1;f=0>1;y="Yes"
l=length;r=filter;h=head;(#)=(,)
u 0=[[]];u n=[x:y|x<-[t,f],y<-u$n-1]
c l=all(==h l)l#and l
X[]|or[fst$c$map(!!(n-1))e|n<-[1..l$h e]]=y|z t=y|z f="No"|t="Maybe"W e=m$u$l s;z m=t#m==(c$map h$q e)
X("Pigs":_:y)=p v((r$(==a).(!!k)).q)m z W((k,v),z,a)=s%y
X(_:_:_:y)=p w q((r(\x->(x!!j/=a)||(x!!k==b))).m)v W((j,u),_:_:z,a)=s%y;((k,w),v,b)=u%z
s%("not":w)=(i,u,not p)W(i,u,p)=s%w
s%(_:"to":_:w)=(0#s,w,t)
s%(w:z)=(maybe(l s,s++[w#l s])(#s)$lookup w s,z,t)
main=interact$p[""#0]id id.words.r(/='.')

এটি ghc কমান্ড লাইন বিকল্প "-cpp" দিয়ে সংকলন করা উচিত। ইনপুট অবশ্যই ইওএফ (^ ডি) দ্বারা শেষ করা উচিত। আপনি http://melpon.org/wandbox/ এ অনলাইনে চেষ্টা করে দেখতে পারেন , তবে আপনি কমান্ড লাইন বিকল্পগুলি সেট করতে পারবেন না। পরিবর্তে, আপনি ভাষা বিকল্পের সাথে প্রোগ্রামটি উপসর্গ করতে পারেন

{-# LANGUAGE CPP #-}

এটি বৈশিষ্ট্যের সেট সংগ্রহ করে, তারপরে ইনপুটটির অন্তর্নিহিততা ব্যবহার করে বৈশিষ্ট্য -> সত্য মূল্যায়নগুলির সেট ফিল্টার করে কাজ করে। ফলাফলটি যথাযথভাবে সত্য এবং মিথ্যা উভয়কেই দেওয়া যেতে পারে তা নিশ্চিত করার জন্য ফলাফলটি পরীক্ষা করা হয় (এখানে ব্যর্থতা হ'ল প্রাক্তন ফলসো কোডলিবিট কেস)। পরিশেষে, এটি প্রতিটি মূল্যায়নে "উড়তে সক্ষম" এর জন্য মান পরীক্ষা করে শূকর তথ্যগুলির সাথে মিলে যা মূল্যবান সন্ধান করে।

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

সম্পাদনা করুন: গর্বিত হাস্কেলারের পরামর্শে বেশ কয়েকটি বাইট সংরক্ষণ করা হয়েছে, তারপরে জেড এবং "ইউ% ড্রপ 2 জেড" কে "_: _: z" এবং "ইউ% জেড" এর বাইন্ডিং দ্বারা প্রতিস্থাপন করে 3 টি সংরক্ষণ করে একাধিক অতিরিক্ত।

সম্পাদনা 2: আরও কিছু সংরক্ষণ করা হয়েছে। 2 বাইট সংরক্ষণের জন্য (#) = (,) ট্রিক ব্যবহার করেছেন এবং প্যাটার্ন প্রতিশব্দ ( https://ghc.haskell.org/trac/ghc/wiki/PternternSynonyms ) সম্পর্কে শিখেছেন , তবে স্বরলিপিটি সঞ্চয়ীকরণের পক্ষে খুব কার্যকর ছিল না এই প্রোগ্রামের বাকি জোড়াগুলি অপসারণ করছে। পার্সার যে প্যাটার্নগুলির জন্য অনুসন্ধান করে সেগুলি পরিবর্তন করে আরও কিছু সঞ্চয় সঞ্চয় করেছেন। উদাহরণস্বরূপ: যদি কোনও বাক্য শূকর দিয়ে শুরু না হয় এবং পার্সার অবস্থায় আমাদের কাছে কিছু অবশিষ্ট থাকে তবে আমরা একটি "সমস্ত কিছু .." বাক্যটি পার্স করি। এটি এক্স এবং% এর নিদর্শনগুলিতে প্রচুর অক্ষর সংরক্ষণ করেছে।


আপনার অনুমানটি সঠিক, আমি প্রথমে এটি উল্লেখ করতে ভুলে গিয়েছিলাম তবে এখন আমি এটি বিশদ বিভাগে যুক্ত করেছি!
vauge

2
আপনার বাইট গণনাতে পতাকাগুলি অন্তর্ভুক্ত করা উচিত ( কোড-গল্ফের জন্য ট্যাগ উইকি দেখুন )। অতএব, এটি 607 বাইট।
nyuszika7h

এটা কি সত্য? লিঙ্কটিতে কেবল ইউনিকোড এনকোডিং সম্পর্কিত ফ্ল্যাগের উল্লেখ রয়েছে; মেটাতে সি ++ পতাকা -D (একটি স্পষ্ট প্রতারণা) বনাম -std = সি ++ 11 সম্পর্কিত একটি নির্দিষ্ট সমস্যার উল্লেখ করা হয়েছে (কোনও নির্দিষ্ট ভাষার প্রকরণ নির্বাচন করা, সম্ভবত ঠিক আছে)। আইএমও ব্যবহার করা পতাকাগুলি হাস্কেল ৯৮ এর পরিবর্তে সাধারণ জিএইচসি এক্সটেনশান সক্ষম করার জন্য, সুতরাং -std = c ++ 11 অনুসারে। রেফ: মেটাকোডগল্ফ.স্ট্যাকেক্সেঞ্জাওয়েজ
ম্যাট

আপনি আপনার দ্বিতীয় সংজ্ঞাটি এর সাথে প্রতিস্থাপন করতে পারেন u n=(:)<$>[t,f]<*>u(n-1)(যদিও এটি নিয়ন্ত্রণের আমদানির প্রয়োজন হবে
App অ্যাপ্লিকেশনিক

1
আপনি গ এর সংজ্ঞাটি এর সাথে প্রতিস্থাপন করতে পারেনc l=(all(==l!!0)l,and l)
গর্বিত হাসেলেলার

6

পাইথন, 547 536 525 521 513 509 497 503 501

m=map
o='not ';R={'':{''}}
S=lambda x,y:filter(len,m(str.strip,x.split(y)))
N=lambda a:[o+a,a[4:]][a[:4]==o]
def C(s):a,c=S(s[19:],'is also');return[(a,c),(N(c),N(a))]
X=lambda A:A&set(m(N,A))and 1/0 or A
for a,c in sum(m(lambda x:[('',x[9:])]if'P'==x[0]else C(x),S(raw_input(),'.')),[]):R.setdefault(a,{a}).add(c)
def F(s):
 i,n={s},{s}
 while 1:
  for r in i:n|=R.get(r,n)
  if X(i)>=n:return i
  i|=n
try:a='able to fly';n=N(a);c={n:'No','':'Maybe'}[''.join({a,n}&m(F,R)[0])]
except:c='Yes'
print c

ইনপুটটির প্রত্যেকটির জন্য a -> b, আমরা প্রদত্ত ধারাটি এবং তার অবজ্ঞাটিকে ধারাগুলির সেটগুলিতে যুক্ত not b -> not a করি এবং তারপরে ->কোনও ফিক্সপয়েন্ট লুপ ব্যবহার করে কোনও প্রস্তাবনা থেকে পৌঁছনীয় এমন প্রস্তাবগুলির সেটটি গণনা করি । যখনই আমরা কোনও দ্বন্দ্বের মুখোমুখি হই তখন আমরা একটি ZeroDivisionErrorএবং মুদ্রণ করি Yes

অবশেষে, আমরা 'উড়ে যেতে সক্ষম' (এবং / অথবা এর প্রত্যাখ্যান) 'ইজ পিগ' প্রস্তাব থেকে পৌঁছনীয় কিনা তা পরীক্ষা ''করে যথাযথ প্রতিক্রিয়াটি মুদ্রণ করি।

সম্পাদনা : এটি বাগি, এটি ঠিক করা। সংশোধন করা হয়েছে।


1
আপনার tryব্লকটি একই লাইনে রেখে 2 বাইট সংরক্ষণ করতে সক্ষম হবেনtry:
আন্ডারগ্রাউন্ডোমোনরাইল

পছন্দ করুন এটি পরিবর্তন।
ব্যবহারকারী 2361830

5

রুবি 1.9.3 ( 365 364 362)

h='able to fly'
i="(not )?(#{h}|\\w+)"
o=->s{n=Regexp.new(i+" (is also|are) "+i).match s
[[n[2],!n[1]],[n[5],!n[4]]]}
c=e=!z=[]
w=->r{z.member?(r)||(z<<(a,b=r)
c|=a[0]==b[0]&&a[1]!=b[1]
w[[[b[0],!b[1]],[a[0],!a[1]]]]
z.map{|q|q[1]==r[0]&&w[[q[0],r[1]]]})}
y=->x{z.member?([[p='Pigs',!e],[h,x]])}
f=->x{x.split(?.).map{|s|w[o[s]]}
c|y[!e]?'Yes':y[e]?'No':'Maybe'}

ব্যবহার

কোড সংজ্ঞায়িত উপরে একটি ফাংশন f, যা এক প্যারামিটার পাঠগত ইনপুট এবং আয় প্রতিনিধিত্বমূলক লাগে Yes, Noঅথবা Maybe

উদাহরণ স্বরূপ:

f['Pigs are old. Everything that is not able to fly is also not old.']
=> "Yes"

অনলাইন পরীক্ষা: http://ideone.com/fxLemg

অব্যাহত কোড (ইউনিট পরীক্ষা সহ) এখানে উপলভ্য ।


* উপলব্ধ (শিরোনাম "অনলাইন পরীক্ষা" এর অধীনে)। বহুবচন, আমার ভাল বন্ধু।
স্ট্যান স্ট্রাম

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