আমাকে ভুল প্রমাণিত কর!


22

ভূমিকা

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

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

ইনপুট

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

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

এটি পরিষ্কার করার জন্য [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))

আউটপুট

আউটপুটটি বুলিয়ান, যেমন কিছু সত্যবাদী মান বা কিছু মিথ্যা মান।

কি করো?

এটি সহজ: পরীক্ষা করা হয়েছে যে হাতে দেওয়া সূত্রটি সন্তুষ্টযোগ্য কিনা, যেমন সামগ্রিক সূত্রটি "সত্য" উপার্জন করে এমন সমস্ত ভেরিয়েবলের কাছে সত্য এবং মিথ্যা কোনও অ্যাসাইনমেন্ট রয়েছে কিনা তা পরীক্ষা করুন। আপনার আউটপুটটি "সত্য" যদি সূত্রটি তাত্পর্যপূর্ণ হয় এবং এটি "মিথ্যা" না হয় will
মজার ঘটনা: এটি সাধারণ ক্ষেত্রে একটি এনপি-সম্পূর্ণ সমস্যা।
দ্রষ্টব্য: একটি সত্য-টেবিল তৈরি করা এবং ফলাফলের কোনও প্রবেশদ্বার সত্য কিনা তা খতিয়ে দেখার অনুমতি রয়েছে।

কর্নার কেস

যদি আপনি একটি খালি তৃতীয় স্তরের তালিকা পান, তবে সেই ধারাটিতে এমন কোনও (ধনাত্মক / নেতিবাচক) পরিবর্তনশীল নেই - একটি বৈধ ইনপুট।
আপনি চাইলে অন্যান্য কোণার কেস অপরিবর্তিত রাখতে পারেন।
আপনি একটি খালি সূত্র (প্রথম স্তরের তালিকার) উপরও সত্য ফিরে আসতে পারেন এবং একটি ফাঁকা দফা (২ য় স্তরের তালিকা) এর ভিত্তিতে মিথ্যা।

কে জিতলো?

এটি কোড-গল্ফ তাই বাইটের সংক্ষিপ্ত উত্তরটি জিতেছে!
স্ট্যান্ডার্ড নিয়ম অবশ্যই প্রয়োগ করা হয়।

টেস্ট-মামলা

[[[P],[Q,R]],[[Q,R],[P]],[[Q],[P,R]]] -> true
[[[],[P]],[[S],[]],[[R],[P]],[[U],[Q]],[[X],[R]],[[Q],[S]],[[],[P,U]],[[W],[Q,U]]] -> true
[[[],[P,Q]],[[Q,P],[]],[[P],[Q]],[[Q],[P]]] -> false
[[[P],[]],[[],[P,S]],[[P,T],[]],[[Q],[R]],[[],[R,S]],[[],[P,Q,R]],[[],[P]]] -> false
optional behavior (not mandatory, may be left undefined):
[] -> true (empty formula)
[[]] -> false (empty clause)
[[[],[]]] -> false (empty clause)

1
আমরা কি ইনপুট হিসাবে নিতে পারি (A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))?
অ্যাডম

1
@ অ্যাডাম, চ্যালেঞ্জ অনুসারে, ফর্ম্যাটটি পুরোপুরি আপনার উপর নির্ভর করবে, যতক্ষণ না এটি তালিকা ভিত্তিকের চেয়ে বেশি তথ্য এনকোড করে না। (যেমন আপনি যে সূত্রটি দিয়েছেন তা সম্পূর্ণরূপে অনুমোদিত)
এসইজেপিএম

@ এসজেপিএম আমি যদি স্বরলিপিটি সঠিকভাবে বুঝতে পারি তবে আমি মনে করি যে তৃতীয় এবং চতুর্থ পরীক্ষার মামলাগুলি সত্য হওয়া উচিত। আমি (পি, কিউ) = (1,1) এবং (পি, কিউ, আর, এস, টি) = (0,0,0,0,0) প্রতিস্থাপন করার চেষ্টা করেছি এবং উভয়ই সত্য বলে খুঁজে পেয়েছি, সুতরাং কমপক্ষে একটি হওয়া উচিত ক্ষেত্রে যেখানে অভিব্যক্তিটি সত্য।
বুসুক্সুয়ান

@ বুসুক্সুয়ান, আমি তৃতীয় এবং চতুর্থটি মিথ্যা বলে 100% নিশ্চিত। 3 এর জন্য): এটি {{P,Q},{P,!Q},{!P,Q},{!P,!Q}}(এই ক্রমে নয়) যা সহজেই প্রদর্শিত হতে পারে এটি একটি দ্বন্দ্ব। ৪) এর জন্য: এটি তুচ্ছভাবে একটি বৈপরীত্য কারণ এটি হ'ল P AND ... AND (NOT P)স্পষ্টতই কখনও পি এর কোনও মানের জন্য সত্য হতে পারে না
SEJPM

2
মজার বিষয় কীভাবে সংক্ষিপ্ত কোডটি লিখতে আরও বেশি পরিশ্রম দরকার।
ব্যবহারকারী 6245072

উত্তর:


41

গণিত, 12 বাইট

SatisfiableQ

ঠিক আছে, একটি অন্তর্নির্মিত আছে ...

ইনপুট ফর্ম্যাট হয় And[Or[a, b, Not[c], Not[d]], Or[...], ...]। এই করে খালি সাব-এক্সপ্রেশন জন্য সঠিকভাবে কাজ, কারণ Or[]হয় Falseএবং And[]হয় True

রেকর্ডের জন্য, এমন একটি সমাধান যা চ্যালেঞ্জ থেকে তালিকাভিত্তিক ফর্ম্যাটটি গ্রহণ করে এবং নিজেই রূপান্তরটি 44 বাইট হয় তবে ওপি একটি মন্তব্যে স্পষ্ট করে বলেছে যে কোনও ফর্ম্যাট যতক্ষণ না এটি অতিরিক্ত তথ্য এনকোড না করে ততক্ষণ ঠিক আছে:

SatisfiableQ[Or@@Join[#,Not/@#2]&@@@And@@#]&

18
কারণ ম্যাথমেটিকা ​​...
লিকি নুন

11
ম্যাথামেটিকায় সত্যিই অন্তর্নির্মিত সংখ্যা রয়েছে number
টেক্সক্র্যাফটিং

3
@ TùxCräftîñg প্রকৃতপক্ষে
jpmc26

15
বিভক্ত-দ্বিতীয়টির জন্য, আমি ভেবেছিলাম যে এই উত্তরটি একটি অস্পষ্ট, স্ট্যাকড-ভিত্তিক এসোলাংয়ে লেখা হয়েছিল, যেখানে কেবল সুযোগেই, কমান্ড সিকোয়েন্সটি S a t i s f i a b l e Qসমস্যার সমাধান করবে। তারপরেই, পাঠ্য অনুধাবন দরজায় কড়া নাড়লো ...
ওজডো

3

হাস্কেল, 203 200 বাইট

t=1<3
e%((t,f):r)=or((e<$>t)++map(not.e)f)&&e%r
e%_=t
u v b e s|s==v=b|t=e s
s e[]c=1<0
s e(v:w)c=e%c||s(u v t e)w c||s(u v(1<0)e)w c
g v[]=v
g v((t,f):r)=g(v++[x|x<-t++f,notElem x v])r
g[]>>=s(\x->t)

এই চ্যালেঞ্জটি কোনও বিল্ড-ইন উত্তরের প্রাপ্য, সুতরাং আপনি এখানে যান। আদর্শে এটি চেষ্টা করুন । অ্যালগরিদম সহজভাবে সমস্ত পরিবর্তনশীল অ্যাসাইনমেন্ট চেষ্টা করে এবং তাদের মধ্যে একটি সূত্রকে সন্তুষ্ট করে কিনা তা পরীক্ষা করে।

ইনপুট আকারে রয়েছে [([],["P","Q"]),(["Q","P"],[]),(["P"],["Q"]),(["Q"],["P"])], যদিও স্ট্রিংয়ের পরিবর্তে প্রতিটি ধরণের সমতা সহকারে কাজ করবে।

অবরুদ্ধ কোড:

type Variable   = String
type CNF        = [([Variable], [Variable])]
type Evaluation = (Variable -> Bool)

satisfies :: Evaluation -> CNF -> Bool
satisfies eval [] = True
satisfies eval ((t,f):r) = or(map eval t ++ map (not.eval) f) && satisfies eval r

update :: Evaluation -> Variable -> Bool -> Evaluation
update eval s b var = if var == s then b else eval var

search :: Evaluation -> [Variable] -> CNF -> Bool
search eval [] cnf = False
search eval (v:vars) cnf = satisfies eval cnf || search (update eval v True) vars cnf || search (update eval v False) vars cnf 

getVars :: CNF -> [Variable] -> [Variable]
getVars [] vars = vars
getVars ((t,f):cnf) vars = getVars cnf (vars ++ [v |v<-(t++f), notElem v vars])

isSat :: CNF -> Bool
isSat cnf = search (\x->True) (getVars cnf []) cnf

1

জাভাস্ক্রিপ্ট 6, 69 বি

x=>f=(v,e)=>(e=v.pop())?[0,1].some(t=>f([...v],eval(e+'=t'))):eval(x)

ব্যবহার:

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