บทนำ
ภารกิจในชีวิตของคุณนั้นง่าย: พิสูจน์คนผิดทางอินเทอร์เน็ต!
ในการทำเช่นนี้คุณมักวิเคราะห์ข้อความของพวกเขาอย่างรอบคอบและชี้ให้เห็นถึงความขัดแย้งในพวกเขา
ถึงเวลาที่จะทำสิ่งนี้โดยอัตโนมัติ แต่เมื่อเราขี้เกียจเราต้องการพิสูจน์คนผิดด้วยความพยายามน้อยที่สุด (อ่าน: รหัสที่สั้นที่สุด) ที่เป็นไปได้
สเปค
อินพุต
การป้อนข้อมูลของคุณจะเป็นสูตรในรูปแบบปกติซึ่งเชื่อมต่อกัน สำหรับรูปแบบคุณสามารถใช้รูปแบบด้านล่างหรือกำหนดรูปแบบของคุณเองตามความต้องการในภาษาของคุณ (คุณไม่สามารถเข้ารหัสในรูปแบบได้มากกว่า CNF ล้วนๆ) อย่างไรก็ตามกรณีทดสอบ (ที่นี่) มีให้ในรูปแบบด้านล่าง (แม้ว่าจะไม่สร้างตัวคุณเองยากเกินไป)
ข้อมูลที่คุณป้อนจะเป็นรายการของรายการตัวแปร (คุณอาจอ่านเป็นสตริง / ต้องการสตริง) อินพุตเป็นสูตรในรูปแบบปกติที่เชื่อมต่อกัน (CNF) ที่เขียนเป็นชุดคำสั่งแต่ละรายการเป็นรายการสองรายการ รายการแรกในข้อเข้ารหัสตัวอักษรบวก (ตัวแปร) รายการที่สองเข้ารหัสตัวอักษร (ลบ) ตัวแปร (ตัวแปร) ตัวแปรทั้งหมดในส่วนคำสั่งคือ 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))
เอาท์พุต
ผลลัพธ์คือบูลีนเช่นค่าความจริงบางอย่างหรือค่าเท็จบางอย่าง
จะทำอย่างไร?
ง่ายมาก: ตรวจสอบว่าสูตรที่ให้ไว้ในมือเป็นที่น่าพอใจหรือไม่เช่นมีการมอบหมายค่าจริงและเท็จบางส่วนให้กับตัวแปรทั้งหมดหรือไม่ซึ่งสูตรโดยรวมให้ผลเป็น "จริง" ผลลัพธ์ของคุณจะเป็น "จริง" หากสูตรนั้นเป็นที่พอใจและ "เป็นเท็จ" หากไม่ใช่
Fun-Fact: นี่เป็นปัญหา NP-complete ในกรณีทั่วไป
หมายเหตุ: การสร้างตารางความจริงและตรวจสอบว่ารายการใด ๆ ที่เกิดขึ้นเป็นจริงได้รับอนุญาต
คดีมุม
หากคุณได้รับรายการระดับ 3 ที่ว่างเปล่าแสดงว่าไม่มีตัวแปร (บวก / ลบ) ในประโยคนั้น - อินพุตที่ถูกต้อง
คุณสามารถออกจากกรณีมุมอื่น ๆ ที่ไม่ได้กำหนดถ้าคุณต้องการ
นอกจากนี้คุณยังสามารถกลับมาจริงเมื่อสูตรว่าง (รายการระดับที่ 1) และเท็จตามข้อที่ว่างเปล่า (รายการระดับที่ 2)
ใครชนะ?
นี่คือ code-golf ดังนั้นคำตอบสั้น ๆ ในหน่วยไบต์ชนะ!
ใช้กฎมาตรฐานแน่นอน
การทดสอบกรณี
[[[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)
{{P,Q},{P,!Q},{!P,Q},{!P,!Q}}
(ไม่อยู่ในคำสั่งนี้) ซึ่งสามารถแสดงได้ง่ายคือความขัดแย้ง สำหรับ 4): นี่เป็นความขัดแย้งเล็กน้อยเพราะเป็นP AND ... AND (NOT P)
สิ่งที่เห็นได้ชัดว่าไม่เป็นความจริงสำหรับคุณค่าใด ๆ ของ P.
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
อะไรได้บ้าง