ในความท้าทายนี้เราจะเขียนโปรแกรม / ฟังก์ชั่นที่แก้ปริศนา " Knights and Knaves "
พื้นหลัง
คุณพบว่าตัวเองบนเกาะ ... ฯลฯ ... ทุกคนบนเกาะยกเว้นสำหรับคุณเป็นทั้งอัศวินหรือคนพาล
อัศวินสามารถสร้างข้อความที่แท้จริงได้เท่านั้น
Knaves สามารถสร้างข้อความเท็จได้เท่านั้น
ฉันไม่ต้องการกำหนด "คำสั่ง" อย่างจริงจัง แต่เราจะพูดว่าข้อความใด ๆ ที่เป็น "จริง" หรือ "เท็จ" โปรดทราบว่าสิ่งนี้ไม่รวมถึงประโยคขัดแย้ง
สำหรับจุดประสงค์ของการท้าทายนี้คุณจะเจอกลุ่มชาวเกาะ พวกเขาจะทำงบกับคุณ
งานของคุณคือการตัดสินว่าใครคืออัศวินและใครเป็นคน knave
การป้อนข้อมูล:
คุณจะได้รับ (ในรูปแบบที่เหมาะสม) ข้อมูลต่อไปนี้:
รายการของผู้คนในปัจจุบัน พวกเขาจะถูกตั้งชื่อด้วยตัวอักษรตัวพิมพ์ใหญ่ "AZ" ขีด จำกัด ของจำนวนคนที่กำหนดโดยสิ่งนี้จะไม่เกิน
งบที่แต่ละคนทำ ดูด้านล่างสำหรับรายละเอียดที่สำคัญเกี่ยวกับเรื่องนี้
เอาท์พุต
จากนั้นคุณจะแสดงผล (ในรูปแบบที่สมเหตุสมผล) ว่าแต่ละคนคืออะไร ตัวอย่างเช่นหากมีผู้เล่นA B C DและAเป็นอัศวิน แต่ส่วนที่เหลือเป็น knaves คุณสามารถส่งออก
A: 1
B: 0
C: 0
D: 0
รายละเอียดที่สำคัญ:
ตัวอักษรตัวพิมพ์ใหญ่ AZ หมายถึงชาวเกาะ
อักขระ
0(ศูนย์) และ1(หนึ่ง) อ้างอิงถึง "Knave" และ "Knight" ตามลำดับ (คุณสามารถใช้อักขระ AZ อื่นที่ไม่ใช่อักขระสองตัวได้ตราบใดที่คุณระบุ)ชาวเกาะแต่ละคนในปัจจุบันอาจทำให้จำนวนงบธรรมชาติหรืออาจเลือกที่จะพูดอะไร
ตัวดำเนินการเชิงตรรกะปกติสามารถใช้ในข้อความสั่ง ( IS *, AND, OR, NOT ) ยิ่งไปกว่านั้นอาจใช้กฎหมายและเงื่อนไขของ De Morgan ต่อไปนี้เป็นตัวอย่างของวิธีที่พวกเขาอาจนำเสนอในตัวต่อพูดแล้วตามด้วยวิธีที่พวกเขาอาจถูกป้อนเข้าสู่โปรแกรม
(* ในหมายเหตุด้านเทคนิคเพิ่มเติมตัวดำเนินการ "IS" ถูกใช้เป็นข้อ จำกัด จริง ๆ (ซึ่งไม่ใช่ตัวดำเนินการเชิงตรรกะ) เมื่อฉันพูดว่า "A is a Knight" ฉันหมายถึง "A เป็นสมาชิกของกลุ่ม Knights "ตัวดำเนินการจริงที่ใช้จะเป็น 'ϵ' เพื่อประโยชน์ของความเรียบง่ายเราจะใช้ '=' แทน)
ฉันใช้สิ่งต่อไปนี้ (คุณสามารถใช้อะไรก็ได้ตราบใดที่มันสมเหตุสมผลและสอดคล้องกัน):
^และvหรือ=คือ~ไม่=>IMPLIESX:Person Xอ้างว่า ...
Person Zสามารถสร้างชุดคำสั่งประเภทใด ๆ ต่อไปนี้:
Person Zบอกว่า ...
บุคคลAคืออัศวิน
Z: A = 1Person Qคือ Knave
Z: Q = 0ฉันเป็นอัศวิน
Z: Z = 1บุคคลAคืออัศวินหรือบุคคลBคืออัศวิน
Z: ( A = 1 ) v ( B = 1)Person Cคือ Knight และฉันเป็น Knave
Z: ( C = 1 ) ^ ( Z = 0 )Person Rไม่ใช่อัศวิน
Z: ~( R = 1 )
ยิ่งไปกว่านั้นข้อมูลอาจใช้กฎของ De Morgan ด้วย
มันไม่เป็นความจริงที่ทั้งคน A และคน B เป็นคนป่าวร้อง
Z: ~( ( A = 0 ) ^ ( B = 0 ) )เป็นเท็จที่บุคคล A หรือบุคคล B เป็นอัศวิน
Z: ~( ( A = 1 ) v ( B = 1) )
ในที่สุดเงื่อนไขและการปฏิเสธของพวกเขาอาจถูกนำมาใช้
ถ้าฉันเป็นอัศวินบุคคล B จะเป็นคน Knave
Z: ( Z = 1 ) => ( B = 0 )มันไม่เป็นความจริงเลยว่าถ้าคน B เป็นอัศวินแล้วบุคคล C เป็นผู้มีความรู้
Z: ~( ( B = 1 ) => ( C = 0 ) )
หมายเหตุเกี่ยวกับเงื่อนไข
ตรวจสอบวิกิพีเดียสำหรับข้อมูลเพิ่มเติม
คำสั่งแบบมีเงื่อนไขใช้แบบฟอร์มp => qโดยที่pและqเป็นคำสั่งของตัวเอง pคือ "บรรพบุรุษ" และqคือ "สืบเนื่อง" นี่คือข้อมูลที่เป็นประโยชน์บางอย่าง
การปฏิเสธเงื่อนไขมีลักษณะดังนี้: ~ (p => q) เทียบเท่ากับ p ^ ~ q
หลักฐานเท็จหมายถึงอะไร นั่นคือ: ถ้าpเป็นเท็จดังนั้นข้อความใด ๆp => qนั้นเป็นจริงโดยไม่คำนึงว่าqคืออะไร ตัวอย่างเช่น: "if 2 + 2 = 5 ดังนั้นฉันคือ Spiderman" เป็นข้อความจริง
กรณีทดสอบง่ายๆ
กรณีเหล่านี้จะได้รับในลักษณะดังต่อไปนี้ (1) วิธีที่เราจะทำให้เกิดปัญหาในการพูด (2) วิธีที่เราอาจวางลงในคอมพิวเตอร์ (3) ผลลัพธ์ที่ถูกต้องที่คอมพิวเตอร์อาจให้
Person A และ Person B เข้าหาคุณบนถนนและทำข้อความต่อไปนี้:
A: B เป็นคนคุกเข่าหรือฉันเป็นอัศวิน
B: A เป็นอัศวิน
ตอบ:
B คืออัศวินและ A คืออัศวิน
การป้อนข้อมูล:
A B # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1
เอาท์พุท:
A = 1 B = 1
คน A, B และ F เข้าหาคุณบนท้องถนนและทำข้อความต่อไปนี้:
ตอบ: ถ้าฉันเป็นอัศวิน B จะเป็นผู้มีไหวพริบ
B: ถ้านั่นเป็นเรื่องจริง F ก็เป็น Knave เหมือนกัน
ตอบ:
A คืออัศวิน B คือ Knave และ F คืออัศวิน
อินพุต
A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 )
เอาท์พุท:
A = 1 B = 0 F = 1
Q, X และ W เข้าหาคุณบนท้องถนนและสร้างข้อความต่อไปนี้:
W: ไม่เป็นความจริงที่ทั้ง Q และ X เป็น Knights
ถาม: นั่นเป็นเรื่องจริง
X: ถ้าสิ่งที่ W พูดว่าเป็นจริงดังนั้นสิ่งที่ Q พูดว่าเป็นเท็จ
ตอบ:
W และ Q คือ Knights X คือ Knave
อินพุต
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
เอาท์พุต
W = 1 Q = 1 X = 0
มี ความท้าทายที่คล้ายกันจาก 3 ปีที่ผ่านมาซึ่งมุ่งเน้นไปที่การแยกวิเคราะห์และไม่ได้มีเงื่อนไขหรือเดมอร์แกน ดังนั้นฉันจะเถียงว่ามีความแตกต่างในการมุ่งเน้นและการนำไปปฏิบัติเพื่อหลีกเลี่ยงปัญหานี้
ความท้าทายนี้ถูกปิดชั่วครู่เป็นผู้ล่อลวง มันถูกเปิดใหม่อีกครั้ง
ฉันอ้างว่าความท้าทายนี้แตกต่างกันไปก่อน ความท้าทายอื่น ๆ มุ่งเน้นไปที่การแยกวิเคราะห์ภาษาอังกฤษสิ่งนี้ไม่ได้ อันดับที่สองใช้เพียง AND และหรือในขณะที่ใช้เงื่อนไขและช่วยให้การแก้ปริศนาอีกมากมาย ในตอนท้ายของวันคำถามคือว่าคำตอบจากความท้าทายนั้นสามารถทดแทนได้เล็กน้อยกับสิ่งนี้หรือไม่และฉันเชื่อว่าการรวมเงื่อนไขและการปฏิเสธตามเงื่อนไขเพิ่มความซับซ้อนเพียงพอที่จะต้องมีการเปลี่ยนแปลงที่แข็งแกร่งมากขึ้น เพื่อให้เหมาะกับความท้าทายนี้
ORมันอาจเป็นเพราะA:1 B:1หรือA:1 B:0ว่า B B=1เป็นเท็จในขณะที่ A ก็ยังเป็นจริง
(B=1)^(C=1)ตามเงื่อนไขของการรับมือกับสถานการณ์โดยทั่วไป
(B=1)=>(C=0)?~((B=1)=>(C=0))หรือ(B=1)=>(C=1)อย่างอื่น?