พื้นหลัง
หากคุณเล่นกอร์ดโค้ดมากคุณอาจทราบถึงการดำเนินการXOR ระดับบิต กำหนดจำนวนเต็มสองตัวมันให้จำนวนเต็มอีกตัวที่มี1
s ในบิตที่อินพุตทั้งสองแตกต่างกัน ตัวอย่างเช่น1010 XOR 0011 = 1001
.
ดูเหมือนจะมีประโยชน์มากในทฤษฎีเกมซึ่งเป็นที่รู้จักกันดีในชื่อ "nim sum" หากคุณมีผลรวมของสองเกม (นั่นคือคุณกำลังเคลื่อนไหวในเกมหนึ่งครั้ง) ค่าของตำแหน่งคือผลรวม nim ของค่าของตำแหน่งในแต่ละเกม
แต่เราสามารถก้าวไปอีกขั้น ด้วยการเพิ่ม nim และนิยามที่เหมาะสมของการคูณ nimเราสามารถสร้างเขตข้อมูลจากจำนวนเต็มที่ไม่ใช่ค่าลบ ดังนั้นความท้าทายคือการคูณกอล์ฟ
คำนิยาม
การทวีคูณของ Nim เป็นไปตามกฎต่อไปนี้:
ผลิตภัณฑ์ nim ของ Fermat 2-power n = (2 ^ (2 ^ k)) ที่มีจำนวนน้อยกว่าเป็นผลิตภัณฑ์สามัญ
ผลิตภัณฑ์ nim ของ Fermat 2-power n ด้วยตัวมันเองคือ 3n / 2
การทวีคูณของ NIM จะกระจายผ่านการเพิ่ม nim
การคูณ Nim คือการสลับและเชื่อมโยง (เช่นการเพิ่ม nim)
ข้อมูลเฉพาะตัวหลายตัวคือ 1 (และตัวตนเพิ่มเติมคือ 0)
จำนวนเต็มที่ไม่ใช่ค่าลบใด ๆ สามารถเขียนเป็นผลรวม nim ของพลังที่แตกต่างกันของสองและอำนาจใด ๆ ของสองสามารถเขียนเป็นผลิตภัณฑ์ของตัวเลขแฟร์มาต์ที่แตกต่างกันดังนั้นนี่คือเพียงพอที่จะกำหนด nim คูณสำหรับจำนวนเต็ม nonnegative ทั้งหมด
ตัวอย่าง
นั่นเป็นนามธรรมที่น่ารักดังนั้นเรามาดูตัวอย่างกัน ฉันจะใช้+
เพื่อแสดงการเพิ่ม nim (XOR) และ*
สำหรับการคูณ nim
6 * 13
= (4 + 2) * (8 + 4 + 1)
= (4 + 2) * ((4 * 2) + 4 + 1)
= (4 * 4 * 2) + (4 * 2 * 2) + (4 * 4) + (4 * 2) + (4 * 1) + (2 * 1)
= (6 * 2) + (4 * 3) + 6 + 8 + 4 + 2
= ((4 + 2) * 2) + 12 + 6 + 8 + 4 + 2
= (4 * 2) + (2 * 2) + 12 + 6 + 8 + 4 + 2
= 8 + 3 + 12 + 6 + 8 + 4 + 2
= 15
กรณีทดสอบเพิ่มเติม
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
ท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นที่ให้จำนวนเต็มที่ไม่ใช่เชิงลบสองตัวในรูปแบบที่สะดวกใด ๆ คำนวณผลิตภัณฑ์ nim ของพวกเขา
นี่คือรหัส - กอล์ฟดังนั้นการส่งที่สั้นที่สุดจึงชนะ