พื้นหลัง
มีสองคนคือบิลและจอห์น หนึ่งในนั้นคืออัศวินที่มักพูดความจริงเสมอและอีกคนหนึ่งเป็นอัศวินซึ่งมักพูดโกหก คุณไม่รู้ว่าใครเป็นอัศวินและใครเป็นอัศวิน จากนั้นแต่ละคนก็พูดหลายประโยคว่าใครเป็นคนอัศวินและใครเป็นอัศวิน การใช้ข้อมูลนี้คุณจะต้องสรุปว่าใครเป็นอัศวินและผู้ที่เป็นอัศวิน
อัศวินและคนพาลปัญหาตรรกะจะขึ้นอยู่กับ Booleen พีชคณิต คำที่คนพูดว่าก่อให้เกิดปัญหาความพึงพอใจ Booleen แถลงการณ์ของผู้พิพากษาต้องเป็นเท็จเสมอและข้อความของอัศวินอื่น ๆ จะต้องเป็นจริงเสมอ
จอห์นบอกว่า "ทั้งฉันเป็นคนคุกเข่าและบิลก็เป็นคนคุกเข่า" หากจอห์นเป็นอัศวินแล้วคำพูดนี้จะเป็นเท็จดังนั้นเขาจึงไม่สามารถเป็นอัศวิน หากเขาเป็นผู้คุกและ Bill เป็นอัศวินแถลงการณ์นี้จะยังคงเป็นเท็จแม้แต่คิดว่าส่วนแรกเป็นจริง ดังนั้นจอห์นเป็นคนคุกเข่า
ความท้าทาย
ความท้าทายของคุณคือการเขียนโปรแกรมที่สั้นที่สุดเท่าที่จะเป็นไปได้ซึ่งจะเขียนรายการคำแถลงของแต่ละคนและจะคิดออกว่าใครคือผู้เป็นอัศวินและใครเป็นอัศวิน มีรายละเอียดมากมายที่จะครอบคลุมดังนั้นปัญหานี้ได้อธิบายไว้ในสามส่วน
อินพุต
อินพุตจะเป็นสองบรรทัดตามด้วยขึ้นบรรทัดใหม่ แต่ละบรรทัดจะให้ชื่อของตัวละครหนึ่งตัวตามด้วยเครื่องหมายจุดคู่ตามด้วยประโยคหลายประโยคที่บุคคลนั้นพูด ถ้าคนคนหนึ่งเป็นอัศวินแล้วประโยคทั้งหมดของเขาจะเป็นจริงและประโยคทั้งหมดของอัศวินจะเป็นเท็จ อักษรตัวแรกของประโยคจะเป็นตัวพิมพ์ใหญ่เสมอและทุกประโยคจะลงท้ายด้วยจุด นี่คือตัวอย่าง:
Joe: Both I am a knight and neither Steve is a knave nor I am a knave.
Steve: Joe is a knave. Either Joe is a knight or I am a knight.
วจีวิภาค
แต่ละประโยคประกอบด้วยประโยคอย่างน้อยหนึ่งประโยค แต่ละประโยคมีหนึ่งในหลาย ๆ สิ่ง (หวังว่าคุณจะเข้าใจสัญลักษณ์ของฉัน):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
นี่เป็นเรื่องที่ไม่น่าเชื่อเพราะสามารถเข้าใจได้ในลักษณะที่คล้ายคลึงกับสัญกรณ์โปแลนด์ นี่คือตัวอย่างของประโยค:
Both I am a knight and neither Steve is a knave nor I am a knave.
การแปลเป็นพีชคณิตแบบบูลนั้นตรงไปตรงมา คำสั่ง "ทั้งสอง" เป็น ANDs คำสั่ง "ทั้ง" เป็น XOR และคำสั่ง "ไม่ใช่" เป็น NOR
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
เอาท์พุต
เอาต์พุตจะประกอบด้วยสองบรรทัด แต่ละบรรทัดประกอบด้วยชื่อของบุคคล (เรียงตามลำดับ) จากนั้นบอกว่าเขาเป็นอัศวินหรือผู้กล้า จะมีหนึ่งอัศวินและหนึ่งอัศวินเสมอ นี่คือผลลัพธ์สำหรับตัวอย่างข้างต้น:
Joe is the knave.
Steve is the knight.
หากปัญหาไม่สามารถแก้ไขได้ (คุณไม่สามารถบอกได้ว่าใครเป็นใครหรือไม่มีวิธีแก้ไข) จากนั้นโปรแกรมของคุณสามารถทำทุกอย่างยกเว้นสร้างผลลัพธ์ที่ถูกต้อง
ตัวอย่างเพิ่มเติม
อินพุต
Sir Lancelot: Either both I am a knight and Merlin is a knave or both I am a knave and Merlin is a knight.
Merlin: Either both I am a knight and Sir Lancelot is a knight or both I am a knave and Sir Lancelot is a knave.
เอาท์พุต
Sir Lancelot is the knight.
Merlin is the knave.
อินพุต
David: Neither I am a knave nor Patrick is a knight. Either I am a knight or Patrick is a knave.
Patrick: Either I am a knight or both I am a knight and David is a knight.
เอาท์พุต
David is the knave.
Patrick is the knight.
อินพุต
Lizard: I am a knight.
Spock: I am a knave.
เอาต์พุตหนึ่งรายการที่เป็นไปได้
Rock Paper Scissors
กฎระเบียบและบันทึก
- บังคับใช้กฎกอล์ฟมาตรฐาน
- โปรแกรมของคุณต้องประกอบด้วย ASCII ที่พิมพ์ได้เท่านั้น
- อินพุตและเอาต์พุตทั้งหมดมาจาก STDIN และ STDOUT