เป้าหมายของคุณคือการเขียนเป็นผู้เล่นที่สมบูรณ์แบบสำหรับการเล่นเกมของWythoff ของสะเดา
กฎของ NIM ของ Wythoff
Wythoff's Nim เป็นเกมที่มีผู้เล่นสองคนที่เล่นกับกองที่เหมือนกันสองกอง ผู้เล่นผลัดกันซึ่งพวกเขาทำอย่างใดอย่างหนึ่งเหล่านี้
- ลบหนึ่งเคาน์เตอร์ขึ้นไปจากกองแรก
- ลบหนึ่งเคาน์เตอร์ขึ้นไปจากกองที่สอง
- ลบจำนวนตัวนับเท่ากัน (อย่างน้อยหนึ่งตัว) จากทั้งกองแรกและกองที่สอง
แน่นอนว่ากองไม่สามารถติดลบได้ แต่พวกเขาสามารถทำได้ถึง 0 ผู้เล่นใดก็ตามที่นับคะแนนสุดท้ายโดยรวมชนะเกม
สำหรับความคิดเชิงเรขาคณิตที่มากขึ้นนี่คือสูตรที่เทียบเท่าของเกมที่คุณสามารถเล่นบนแอปเพล็ตนี้ ราชินีเดี่ยวเริ่มต้นบนกระดานหมากรุกที่ไม่มีที่สิ้นสุดของสี่เหลี่ยมจัตุรัสซึ่งมีมุมอยู่ทางซ้ายล่าง ผู้เล่นเลือกที่จะย้ายราชินีซึ่งเคลื่อนไหวเหมือนราชินีหมากรุก แต่ถูก จำกัด ไว้ที่สามทิศทาง:
- ลง
- ซ้าย
- ทแยงมุมลงและซ้าย
ใครก็ตามที่ย้ายราชินีไปยังมุมที่ชนะ
เชื่อมโยงพิกัดของราชินี (กับมุม(0,0)
) กับขนาดของเสาเข็มที่เกี่ยวข้องมันเป็นเรื่องง่ายที่จะเห็นทั้งสองเกมเหมือนกัน
การเล่นที่สมบูรณ์แบบ
(คุณสามารถข้ามสิ่งนี้ได้หากคุ้นเคยกับแนวคิดของการเล่นที่สมบูรณ์แบบและการเคลื่อนไหวที่ชนะ)
ตั้งแต่ Wythoff ของสะเดาเป็นเกมที่ จำกัด และกำหนดก็มีความคิดของการเล่นที่สมบูรณ์แบบ ผู้เล่นที่สมบูรณ์แบบคือกลยุทธ์ที่มักจะชนะจากตำแหน่งที่ชนะในทางทฤษฎีซึ่งหมายถึงตำแหน่งที่มีกลยุทธ์ที่รับประกันการชนะ
เพื่อเป็นกลยุทธ์ในการชนะมันพอเพียงที่จะย้ายไปยังตำแหน่งที่ชนะตามทฤษฎีสำหรับผู้เล่นที่เพิ่งย้ายไปและทำให้ผู้เล่นไม่ไปต่อไป ครั้งแรกของตำแหน่งชนะเลิศเหล่านี้ (หรือที่เรียกว่าตำแหน่งเย็น ) (0,0), (1,2), (2,1), (3,5), (5,3)
เป็น ดูบทความวิกิพีเดียสำหรับคำอธิบายเกี่ยวกับอัลกอริทึมเพื่อค้นหากลยุทธ์การชนะสำหรับนิมของ Wythoff รวมถึงสูตรการสร้างตำแหน่งการชนะ
ข้อกำหนดของโปรแกรม
เขียนโปรแกรมหรือฟังก์ชั่นใช้ตำแหน่งเป็นอินพุทและเอาท์พุทย้ายชนะในรูปแบบของตำแหน่งหลังจากที่ย้าย ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ
หากไม่มีการย้ายที่ชนะอยู่นั่นคือตำแหน่งเป็นการสูญเสียทางทฤษฎีโปรแกรมของคุณควรระบุเช่นนั้นและปรับเสีย
โปรแกรมของคุณต้องทำงานภายในระยะเวลาที่เหมาะสม ดังนั้นการค้นหาทรีเกมแบบเรียกซ้ำแบบเอ็กซ์โพเนนเชียลจะไม่เพียงพอ หากคุณต้องการคำนวณกลยุทธ์ล่วงหน้าและกำหนดรหัสให้ยาก
อินพุต
คู่ของตัวเลขที่ไม่ใช่เชิงลบที่เป็นตัวแทนของขนาดกองแต่ละที่มากที่สุด(i,j)
99
นี่อาจเป็นตัวเลขสองตัว tuple รายการหรือคอนเทนเนอร์ที่คุณต้องการ
เอาท์พุต
พิมพ์หรือส่งออกตำแหน่งหลังจากที่คุณย้ายอีกครั้งเป็นตัวเลขสองหรือภาชนะดังกล่าว นี่จะเป็นการย้ายที่ถูกกฎหมายไปยังตำแหน่งที่ชนะ หากมีการเคลื่อนไหวดังกล่าวหลายครั้งผู้ใดทำได้ดี แต่มีเพียงผู้เดียวเท่านั้น
หากไม่มีการย้ายที่ชนะคุณต้องระบุสิ่งนี้ในผลลัพธ์ เอาต์พุตใด ๆ เช่นFalse
, None
0, หรือ(-1,-1)
จะทำตราบใดที่มันไม่ใช่ตำแหน่งทางกฎหมายและจะเหมือนกันสำหรับอินพุตที่เสียทุกครั้ง
ตัวอย่างการวิ่ง
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)