নাইটস এবং কানভেস


12

এটি

এই চ্যালেঞ্জের মধ্যে আমরা এমন প্রোগ্রাম / ফাংশন লিখব যা " নাইটস এবং কানভেস " ধাঁধা সমাধান করে।

পটভূমি

আপনি নিজেকে একটি দ্বীপে খুঁজে পেয়েছেন ... ইত্যাদি ... দ্বীপের প্রতিটি ব্যক্তি আপনার জন্য নাইট বা ছুরি

নাইটরা কেবল সত্য বিবৃতি দিতে পারে।

কাভেনস কেবলমাত্র মিথ্যা বিবৃতি দিতে পারে।

আমি কঠোরভাবে "বিবৃতি" সংজ্ঞায়িত করতে চাই না, তবে আমরা বলব একটি বিবৃতি এমন কিছু যা "সত্য" বা "মিথ্যা"। নোট করুন যে এটি বিদ্বেষমূলক বাক্যগুলি বাদ দেয়।

এই চ্যালেঞ্জের উদ্দেশ্যে, আপনি দ্বীপপুঞ্জের বিভিন্ন দল জুড়ে আসবেন; তারা আপনাকে বিবৃতি দেবে।

আপনার কাজটি কে একজন নাইট এবং কে একজন নৈব তা নির্ধারণ করা।

ইনপুট:

আপনাকে নিম্নলিখিত তথ্য (কোনও যুক্তিসঙ্গত বিন্যাসে) দেওয়া হবে:

  • উপস্থিত লোকদের একটি তালিকা। তাদের বড় হাতের অক্ষরের সাথে নাম দেওয়া হবে "এজেড"। এটি দ্বারা আরোপিত মানুষের সংখ্যার সীমা অতিক্রম করা হবে না।

  • প্রতিটি ব্যক্তি যে বিবৃতি দেয়। এই সম্পর্কে গুরুত্বপূর্ণ বিশদ জন্য নীচে দেখুন।

আউটপুট

তারপরে আপনি প্রতিটি ব্যক্তি কী তা আউটপুট (কোনও যুক্তিসঙ্গত ফর্ম্যাটে) পাবেন। উদাহরণস্বরূপ, যদি খেলোয়াড় থাকে A B C Dএবং Aএকটি নাইট হয় তবে বাকীগুলি ছুরি হয় তবে আপনি আউটপুট পেতে পারেন

A: 1
B: 0
C: 0
D: 0

গুরুত্বপূর্ণ বিশদ:

  • বড় হাতের বর্ণমালা অক্ষর AZ দ্বীপপুঞ্জীদের উল্লেখ করে।

  • অক্ষর 0(শূন্য) এবং 1(একটি) যথাক্রমে একটি "ন্যাভ" এবং "নাইট" উল্লেখ করে। (আপনি যতক্ষণ না নির্দিষ্ট দুটি অন্য জেড অক্ষর অক্ষর করতে পারেন)

  • উপস্থিত প্রতিটি দ্বীপপুঞ্জ যে কোনও প্রাকৃতিক সংখ্যক বিবৃতি দিতে পারে, বা কিছুই না বলতে পছন্দ করতে পারে।

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

(* আরও প্রযুক্তিগত নোটের উপরে। "আইএস" অপারেটরটি সত্যিই কন্টেন্ট হিসাবে ব্যবহৃত হয় (যা লজিকাল অপারেটর নয়) I আমি যখন "এ নাইট ইজ" বলি তখন আমার সত্যিকার অর্থে "এ" সেট এর সদস্য নাইটস "। প্রকৃত অপারেটরটি 'ϵ' হবে simp সরলতার জন্য আমরা এর পরিবর্তে '=' ব্যবহার করব))

আমি নিম্নলিখিতটি ব্যবহার করি (যতক্ষণ না এটি যুক্তিসঙ্গত এবং ধারাবাহিক হিসাবে আপনি যা কিছু ব্যবহার করতে পারেন):

  • ^ এবং
  • v অথবা
  • = আইএস
  • ~ না
  • => বোঝা
  • X:ব্যক্তি এক্স দাবি করেছেন যে ...

ব্যক্তি জেড নিম্নলিখিত ধরণের বিবৃতিগুলির যে কোনও সমন্বয় করতে পারে:

ব্যক্তি জেড বলেছেন যে ...

  1. ব্যক্তি একজন নাইট।

    Z: A = 1

  2. পার্সন কিউ একজন নাভি ave

    Z: Q = 0

  3. আমি একজন নাইট।

    Z: Z = 1

  4. ব্যক্তি একজন নাইট বা ব্যক্তি বি একজন নাইট।

    Z: ( A = 1 ) v ( B = 1)

  5. ব্যক্তি সি একজন নাইট এবং আমি একজন নৈব।

    Z: ( C = 1 ) ^ ( Z = 0 )

  6. ব্যক্তি আর একজন নাইট নয়।

    Z: ~( R = 1 )

এর উপরে, ইনপুট ডি মরগানের আইনগুলিও ব্যবহার করতে পারে

  1. এটি সত্য নয় যে, এ এবং ব্যক্তি বি উভয়ই ক্যানভস

    Z: ~( ( A = 0 ) ^ ( B = 0 ) )

  2. এটি মিথ্যা যে ব্যক্তি এ বা ব্যক্তি বি হয় নাইট

    Z: ~( ( A = 1 ) v ( B = 1) )

অবশেষে, শর্তসাপেক্ষ এবং তাদের অবহেলা ব্যবহার করা যেতে পারে

  1. আমি যদি একজন নাইট, তবে ব্যক্তি বি হ'ল নৈব

    Z: ( Z = 1 ) => ( B = 0 )

  2. এটি সত্য নয় যে ব্যক্তি বি যদি একজন নাইট হয় তবে ব্যক্তি সি একজন নৈব।

    Z: ~( ( B = 1 ) => ( C = 0 ) )

শর্তসাপেক্ষে নোট

পরীক্ষা করে দেখুন উইকিপিডিয়া আরও তথ্যের জন্য।

শর্তসাপেক্ষ বিবৃতি p => q রূপ নেয় , যেখানে p এবং q নিজেই বিবৃতি। p হল "পূর্ববর্তী" এবং q হল "ফলস্বরূপ"। এখানে কিছু দরকারী তথ্য

  • একটি শর্তের উপেক্ষা এইরকম মনে হচ্ছে: ~ (p => q) পি ^ ~ কিউ এর সমতুল্য

  • একটি ভুল ভিত্তি কিছু বোঝায়। অর্থাৎ যদি পি মিথ্যা, যেকোনো বিবৃতি পি => কুই সত্য, কি নির্বিশেষে কুই হয়। উদাহরণস্বরূপ: "যদি 2 + 2 = 5 তবে আমি স্পাইডারম্যান" একটি সত্য বিবৃতি।

কিছু সাধারণ পরীক্ষার কেস

এই কেসগুলি নিম্নোক্ত ফ্যাশনে দেওয়া হয়েছে (1) আমরা কীভাবে বক্তৃতাতে সমস্যা তৈরি করব (2) আমরা কম্পিউটারে এটি কীভাবে জাহির করতে পারি (3) কম্পিউটারটি দিতে পারে এমন সঠিক আউটপুট।

  1. ব্যক্তি ক এবং ব্যক্তি বি রাস্তায় আপনার কাছে যান এবং নিম্নলিখিত বিবৃতি দিন:

    উঃ বি হ'ল ছুরি বা আমি নাইট।

    বি: ক একটি নাইট।

উত্তর:

বি একটি নাইট এবং এ একটি নাইট।

ইনপুট:

A B        # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1

আউটপুট:


    A = 1
    B = 1
    

  1. এ, বি এবং এফ ব্যক্তিরা আপনাকে রাস্তায় পৌঁছে নিম্নলিখিত বিবৃতি দেয়:

    উত্তর: আমি যদি একজন নাইট, তবে বি হ'ল নৈব।

    বি: যদি এটি সত্য হয়, তবে এফটিও একটি ন্যাভ।

উত্তর:

ক একটি নাইট, বি একটি নৈব, এফ একটি নাইট Kn

ইনপুট

A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 ) 

আউটপুট:


    A = 1
    B = 0
    F = 1
    

  1. প্রশ্ন, এক্স এবং ডব্লু আপনাকে রাস্তায় পৌঁছে নীচের বিবৃতি দিন:

    ডাব্লু: এটি সত্য নয় যে Q এবং X উভয়ই নাইট।

    প্রশ্ন: সত্য।

    এক্স: ডাব্লু যা বলেছে তা যদি সত্য হয়, তবে প্রশ্ন যা বলে তা মিথ্যা।

উত্তর:

ডাব্লু এবং কিউ নাইটস। এক্স একটি নৈব।

ইনপুট

Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )

আউটপুট


    W = 1
    Q = 1
    X = 0
    

একটা হল অনুরূপ চ্যালেঞ্জ 3 বছর আগে পার্স এবং কন্ডিশন থাকে না বা ডি মরগান এর উপর যে দৃষ্টি নিবদ্ধ থেকে। এবং তাই, আমি যুক্তি দিয়ে বলব, এটিকে একটি ছদ্মবেশ এড়ানোর জন্য ফোকাস এবং বাস্তবায়নে যথেষ্ট আলাদা।

এই চ্যালেঞ্জটি ডুপ হিসাবে সংক্ষেপে বন্ধ ছিল। এটি আবার খোলা হয়েছে।

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


কোনও নাভ বললে আমরা কী উপসংহার নিতে পারি (B=1)=>(C=0)? ~((B=1)=>(C=0))বা (B=1)=>(C=1)অন্য কিছু?
এনজিপিপোরগান

এটি 5 মিনিটেরও কম সময়ে করা অসম্ভব। এই সমস্যাটি স্যাট হিসাবে পরিচিত, এবং জটিলতায় এটি ক্ষতিকারক। সুতরাং সাধারণ ক্ষেত্রে n = 26 (2 স্যাট নয়) এর জন্য, উপযুক্ত কম্পিউটারে কম্পিউটারে সমাধান করা অসম্ভব।
ল্যাব

আপনার প্রথম পরীক্ষার ক্ষেত্রে 2 টি সম্ভাব্য আউটপুট রয়েছে। আপনি যেমন লজিকাল ব্যবহার করছেন OR, এটি হতে পারে A:1 B:1বা A:1 B:0বি এর B=1ক্ষেত্রে মিথ্যা হতে পারে, তবে এ সত্য হবে।
কাটেনকিও

@ এনজপিপোরগান যদি নাভ বি হয় তবে তিনি এটি বলতে পারবেন না। একটি ভ্রান্ত ভিত্তি যা কিছু বোঝায় তাই সেই বক্তব্যটি সত্য হবে। যদি নাভ ভিন্ন চরিত্রটি কী, আপনি অস্বীকৃতিটি গ্রহণ করবেন, যা (B=1)^(C=1)সাধারণত কন্ডিশনালদের সাথে কীভাবে আচরণ করা হয়
লিয়াম

1
যারা ভাবছেন তাদের ক্ষেত্রে আসল বিষয়টি হ'ল কারণ আমি ইনপুট ক্যোয়ারীর দিকে চেয়েছিলাম এবং তিনি শব্দযুক্ত ধাঁধাটির দিকে তাকিয়ে ছিলেন। এটি স্থির করা হয়েছে
ক্যামেরন আভিক

উত্তর:


6

পাইথন 3, 450 342 307 বাইট

সম্পাদনা: দেখা যাচ্ছে আমি একটি আমদানি ভুলে গেছি ...

আমার প্রথম সমাধান প্রশ্নের জন্য নমনীয় নামকরণের সুবিধা গ্রহণ করে

from functools import*
def g(c,r):c=c.split();l,y=len(c),range;d=[dict((c[i],n>>i&1)for i in y(l))for n in y(2**l)];return[n[1]for n in[[eval(reduce(lambda x,y:x.replace(y,str(d[i][y])),d[i],')and '.join(['not',''][d[i][s[0]]]+'('+s[2:].replace('->','<1or')for s in r)+')')),d[i]]for i in y(len(d))]if n[0]]

আপনি উপরের সাথে কল করতে পারেন

g('Q X W', ['W: not( ( Q == 1 ) and ( X == 1 ) )','Q: W == 1', 'X: ( W == 1 ) -> ( Q == 0 )'])

এখানে পরেরটি ওপি-তে দেখা একই প্রশ্নের একই ফর্ম্যাটটি ব্যবহার করে, এতে প্রথমটিতে আমার করা কিছু পরিবর্তনও নেই। এটি 417 বাইট কারণ এটি দুটি ফর্ম্যাটের মধ্যে রূপান্তর করে।

from functools import*
def g(c,r):c=c.split();l,y=len(c),range;d=[{**dict((c[i],n>>i&1)for i in y(l)),**{'v':'or','^':'and','=':'==','~':'not'}}for n in y(2**l)];f=lambda r,c:reduce(lambda x,y:x.replace(y,str(c[y])),c,('(0<1'+''.join([')^ '+['~',''][c[t[0]]]+'('+t[1]for t in[s.split(":")for s in r]])+')').replace('=>','<1or'));return[dict((o,j) for o,j in n[0].items() if o in c) for n in[[d[i],eval(f(r,d[i]))]for i in y(len(d))]if n[1]]

এবং এটি দ্বারা কল করা যেতে পারে:

g('Q X W', ['W: ~( ( Q = 1 ) ^ ( X = 1 ) )','Q: W = 1', 'X: ( W = 1 ) => ( Q = 0 )'])

তারা দুজনেই ফিরে আসে

[{'X': 0, 'W': 1, 'Q': 1}]

অব্যক্ত ব্যাখ্যা:

from functools import *
def knight_and_knaves(cast,rules):
    # turns 'A B C' into ['A','B','C']
    cast = cast.split()
    # gets all numbers that can fit in len(cast) bits
    bitmasks = range(2 ** len(cast))
    # for every bitmask, apply the value for a bit to the boolean value for each cast member.
    # This returns a dictionary of all possible outcomes.
    d=[dict((cast[i], n>>i & 1) for i in range(len(cast))) for n in bitmasks]
    # Split rules at colon
    rules = [s.split(":")for s in rules]
    # Turns list of rules into one python expression, joins each rule with ')and ', maybe a 'not' depending on if the hypothesis has the rule as a lie, and '('.
    # Also replaces '->' with '<1or' which is equivalent to it. Also starts with '(True' and ends with ')' to resolve missing parentheses
    transform_rules = lambda d, rules: ('(True' + ''.join([')and ' + ['not', ''][d[rule[0]]] + '(' + rule[1].replace('->','<1or') for rule in rules]) + ')')
    # Applys transform_rules on each outcome and evaluates the result, storing it into a list of lists where each element is [outcome, value]
    outcomes=[[d[i],eval(reduce(lambda x,y:x.replace(y,str(d[i][y])),d[i],transform_rules(d[i], rules)))] for i in range(len(d))]
    # Filters outcomes if value is True
    return[n[0]for n in outcomes if n[1]]

এছাড়াও, দ্বিতীয় সমাধানটি পিইপি 448 ব্যবহারের কারণে 3.5 (3.4 নয়) প্রয়োজন


1

গণিত, 80 বাইট

F[c_,s_]:=Select[Thread[c->#]&/@{True,False}~Tuples~Length@c,And@@Equal@@@s/.#&]

ব্যাখ্যা

ফাংশন Fদুটি আর্গুমেন্ট লাগে,

  • c সমস্ত অক্ষরের নামের একটি তালিকা,
  • s বিবৃতিগুলির একটি তালিকা, যার প্রত্যেকটির দুটি অংশ রয়েছে - কে কী বলে।

উদাহরণস্বরূপ, তিনটি অক্ষর, কিউ, এক্স এবং ডাব্লু রয়েছে

characters={q,x,w};

এবং তারা বলে,

statements=
   {{w, !((q==True)&&(x==True))   },
    {q, w==True                   },
    {x, Implies[w==True,q==False] }};

যেখানে Trueএবং Falseযথাক্রমে নাইটস এবং কানভেসের অর্থ। তারপর

F[characters, statements]

দেবে {{q->True, x->False, w->True}}, যার অর্থ কেবলমাত্র একটি সমাধান আছে যে প্রশ্ন এবং ডাব্লু নাইটস যখন এক্স হ'ল ন্যাভ। যদি একাধিক সমাধান থাকে তবে আউটপুটটি দেখতে পাবেন{{...},{...},...}


অ্যালগরিদম খুব সহজ। {True,False}~Tuples~Length@cচরিত্রগুলির মধ্যে নাইটস এবং কানভেসের সমস্ত সম্ভাব্য সংমিশ্রণ দেয়। তারপরে Thread[c->#]&/@এই সংমিশ্রণের উপর ভিত্তি করে নিয়মের একটি অ্যারে তৈরি করুন। A এবং B দুটি চরিত্রের ক্ষেত্রে অ্যারে হবে

{{a->True, b->True },
 {a->True, b->False},
 {a->False,b->True },
 {a->False,b->False}}

এই বিধিগুলির এক সারি দিয়ে বিবৃতিগুলি প্রতিস্থাপন করে আমরা একটি অ্যারের মতো দেখতে পাব

{{True,True},{True,False},{False,False}}

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

Select[...,And@@Equal@@@s/.#&]

বিকল্পগুলি করে এবং শর্তটি সন্তুষ্ট করে এমন সংমিশ্রণগুলি নির্বাচন করে।


1

রুবি, 128

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

বিবৃতি ইনপুট অবশ্যই হবে:

  • & এবং
  • | অথবা
  • == আইএস
  • ! না
  • > বোঝা
  • X: ব্যক্তি এক্স দাবি করেছেন যে ...

আমার প্রতিটি বিবৃতি এবং উপ-বিবৃতিটি প্রথম বন্ধনীতে থাকতে হবে। এই সংস্করণটির একমাত্র সমস্যাটি হ'ল এটি বেশিরভাগ 2 ^ 26 পুনরাবৃত্তির মধ্য দিয়ে যায় এবং যদি তারা সব ছুরি না হয় তবে কমপক্ষে 2 ^ (26-n) পুনরাবৃত্তি হয় ! এই দৃষ্টিকোণে রাখার জন্য, এর অর্থ হ'ল যদি দু'জন লোক থাকে এবং কমপক্ষে একজন ছুরি না হয় তবে এটি সর্বনিম্ন 16,777,216 পুনরাবৃত্তি গ্রহণ করতে পারে !

এটি সীমাবদ্ধ করতে, আমি 168 বাইটে নিম্নলিখিত জমা দিন। মধ্যে উপ 26জন্য #{o.size}161 ফিরিয়ে কাটা।

->s{o=s[/.*?$/].split
i=0
eval h=o.zip(("%0#{o.size}b"%i+=1).chars).map{|k|k*?=}*?;until h&&o.all?{|t|!s[/#{t}:(.*)$/]||eval("(#{t}<1)^(#{$1.gsub(?>,'!=true||')})")}
h}

তবে আমি পরিবর্তে যদি মানুষের একটি অ্যারে এবং বিবৃতিগুলির মানচিত্র ব্যবহার করতে পারি তবে:

c[[?A, ?B],
  {
    ?A=> "( B == 0 ) | ( A == 1)",
    ?B=> "A == 1"
  }
 ]

তারপরে আমি এটি নামিয়ে 128 এ নামছি।

->o,s{i=0
eval h=o.zip(("%026b"%i+=1).chars).map{|k|k*?=}*?;until h&&s.all?{|t,k|eval("(#{t}<1)^(#{k.gsub(?>,'!=true||')})")}
h}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.