ต่ำสุด: 0 บิต
แม็กซ์: 1734 243 บิต (4.335 4.401 บิต / บอร์ดตัดจำหน่าย)
ที่คาดว่าจะ 351 177 บิต (4.376 4.430 บิต / คณะตัดจำหน่าย)
เนื่องจากฉันสามารถกำหนดอินพุทและเอาท์พุทได้อย่างไรก็ตามฉันต้องการฉันตัดสินใจที่จะเข้ารหัสประวัติศาสตร์ของเกมจนถึงจุดนี้ ข้อได้เปรียบอย่างหนึ่งคือข้อมูลเพิ่มเติมของผู้ที่กลับมาเป็น en-passant และผู้ที่มีความสามารถในการสร้างปราสาทที่สามารถรับและไม่เข้ารหัส
ความพยายามที่ 1:
อย่างไร้เดียงสาฉันคิดว่าฉันสามารถเข้ารหัสแต่ละการเคลื่อนไหวใน 12 บิต, 4 Triplets ของรูปแบบ (เริ่มต้น x, เริ่มต้น y, สิ้นสุด x, สิ้นสุด y) โดยที่แต่ละ 3 บิต
เราจะถือว่าตำแหน่งเริ่มต้นและย้ายชิ้นส่วนจากที่นั่นด้วยสีขาวไปก่อน กระดานถูกจัดวางไว้เพื่อให้ (0, 0) เป็นมุมซ้ายล่างของสีขาว
ตัวอย่างเช่นเกม:
e4 e5
Nf3 f6
Nxe5 fxe5
... ...
จะถูกเข้ารหัสเป็น:
100001 100010 100110 100100
110000 101010 101110 101101
101010 100100 101101 100100
...
สิ่งนี้นำไปสู่การเข้ารหัสบิต12 ม.โดยที่mคือจำนวนการเคลื่อนไหว
ในอีกด้านหนึ่งนี้อาจมีขนาดใหญ่มากในทางกลับกันคุณสามารถพิจารณาแต่ละการเคลื่อนไหวว่าเป็นเกมของตัวเองดังนั้นการเข้ารหัสแต่ละครั้งจะเข้ารหัสm "กระดานหมากรุก" หากคุณตัดจำหน่ายคุณจะได้รับ "กระดานหมากรุก" แต่ละอันคือ 12 บิต แต่ฉันรู้สึกว่านี่เป็นการโกง ...
พยายาม 2:
ฉันตระหนักว่าการเคลื่อนไหวแต่ละครั้งในความพยายามก่อนหน้านี้เป็นการเข้ารหัสการเคลื่อนไหวที่ผิดกฎหมายจำนวนมาก ดังนั้นฉันจึงตัดสินใจเข้ารหัสการเคลื่อนไหวทางกฎหมายเท่านั้น เราแจกแจงการเคลื่อนไหวที่เป็นไปได้ดังต่อไปนี้ให้ระบุจำนวนแต่ละช่องเช่น (0, 0) → 0, (1, 0) → 1, (x, y) → x + 8 y วนซ้ำผ่านแผ่นกระเบื้องและตรวจสอบว่ามีชิ้นส่วนใดบ้างและสามารถเคลื่อนที่ได้หรือไม่ ถ้าเป็นเช่นนั้นเพิ่มตำแหน่งก็สามารถไปที่รายการ เลือกดัชนีรายการที่คุณต้องการย้าย เพิ่มหมายเลขนั้นในจำนวนการเคลื่อนย้ายทั้งหมดที่ถ่วงน้ำหนักโดย 1 บวกกับจำนวนการเคลื่อนไหวที่เป็นไปได้
ตัวอย่างข้างต้น: จากตำแหน่งเริ่มต้นชิ้นแรกที่ย้ายสามารถเป็นอัศวินในตารางที่ 1 ก็สามารถย้ายไปยังตาราง 16 หรือ 18 [(1,16),(1,18)]
เพื่อเพิ่มเหล่านั้นไปยังรายการ ถัดไปคืออัศวินในตารางที่ 6 เพิ่มการเคลื่อนไหวของมัน โดยรวมแล้วเราได้รับ:
[(1,16),(1,18),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
เนื่องจากเราต้องการการเคลื่อนไหว (12, 28) เราเข้ารหัสสิ่งนี้เป็น 13 ในฐาน 20 เนื่องจากมีการเคลื่อนไหวที่เป็นไปได้ 20 รายการ
ดังนั้นตอนนี้เราได้รับหมายเลขเกม g 0
= 13
ต่อไปเราทำเช่นเดียวกันสำหรับสีดำยกเว้นเราเรียงหมายเลขไพ่ในลำดับย้อนกลับ (เพื่อให้ง่ายขึ้นไม่จำเป็นต้องใช้) เพื่อรับรายการการเคลื่อนไหว:
[(1,16),(1,18),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
เนื่องจากเราต้องการการเคลื่อนไหว (11, 27) เราเข้ารหัสสิ่งนี้เป็น 11 ในฐาน 20 เนื่องจากมีการเคลื่อนไหวที่เป็นไปได้ 20 รายการ
ตอนนี้เราได้หมายเลขเกม g 1
= (11 ⋅ 20) + 13 = 233
ต่อไปเราจะได้รับรายการการเคลื่อนไหวต่อไปนี้สำหรับสีขาว:
[(1,16),(1,18),(3,12),(3,21),(3,30),(3,39),(4,12),(5,12),(5,19),(5,26),(5,33),(5,40),(6,12),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27)(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
เนื่องจากเราต้องการการเคลื่อนไหว (6, 21) เราเข้ารหัสสิ่งนี้เป็น 13 ในฐาน 29 เนื่องจากมีการเคลื่อนไหวที่เป็นไปได้ 29 รายการ
ดังนั้นตอนนี้เราได้รับหมายเลขเกม g 2
= ((13 ⋅ 20) + 11) 20 + 13 = 5433
ต่อไปเราจะได้รับรายการการเคลื่อนไหวต่อไปนี้สำหรับสีดำ:
[(1,11),(1,16),(1,18),(2,11),(2,20),(2,29),(2,38),(2,47),(3,11),(4,11),(4,18),(4,25),(4,32),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]
เนื่องจากเราต้องการการย้าย $ (10, 18) $ (10, 18)
ดังนั้นตอนนี้เราได้รับหมายเลขเกม g 3
= ((((19 ⋅ 29 + 13) 20) + 11) 20 + 13 = 225833
และทำกระบวนการนี้ต่อไปสำหรับการเคลื่อนไหวที่เหลือทั้งหมด คุณคิดว่าgเป็นฟังก์ชัน g (x, y, z) = x y + z ดังนั้น g 0
= g (1, 1, 13), g 1
= g (g (1, 1, 11), 20, 13), g 2
= g (g (g (1, 1, 13), 20, 11), 20, 13), g 3
= g (g (g (g (1, 1, 19), 29, 13), 20, 11), 20, 13)
ในการถอดรหัสเกมหมายเลขg 0เราเริ่มต้นที่ตำแหน่งเริ่มต้นและระบุการเคลื่อนไหวที่เป็นไปได้ทั้งหมด จากนั้นเราคำนวณg 1 = g 0 // l , m 0 = g 0 % l , ที่lคือจำนวนของการเคลื่อนไหวที่เป็นไปได้, '//' เป็นตัวดำเนินการหารจำนวนเต็มและ '%' เป็นตัวดำเนินการโมดูลัส มันควรจะถือได้ว่ากรัม0 = กรัม1 + ม. 0 ต่อไปเราทำการย้ายm 0และทำซ้ำ
จากตัวอย่างข้างต้นถ้าg 0 = 225833 ดังนั้นg 1 = 225833 // 20 = 11291 และm 0 = 225833% 20 = 13 ถัดไปg 2 = 11291 // 20 = 564 และm 1 = 11291% 20 = 11 จากนั้นg 3 = 11291 // 20 = 564 และm 2 = 11291% 20 = 11 ดังนั้นg 4 = 564 // 29 = 19 and_m_ 3 = 564% 29 = 13. ในที่สุดg 5 = 19 // 29 = 0 และm 4 = 19% 29 = 19
ดังนั้นใช้บิตจำนวนเท่าใดในการเข้ารหัสเกมด้วยวิธีนี้
สำหรับความเรียบง่ายสมมติว่ามีการเคลื่อนไหว 20 ครั้งต่อรอบและสำหรับกรณีสถานการณ์ที่เลวร้ายที่สุดเราเลือกหนึ่งที่ยิ่งใหญ่ที่สุดเสมอ 19. จำนวนที่เราจะได้รับคือ 19 ⋅ 20 m
+ 19 ⋅ 20 m-1
+ 19 ⋅ 20 m-2
+ ⋯ + 19 ⋅ 20 + 19 = 20 m + 1
- 1 โดยที่ _m คือจำนวนการเคลื่อนไหว ในการเข้ารหัส 20 m + 1
- 1 เราต้องการ
บิตlog 2
(20 m + 1 ) บิตซึ่งเป็น (m + 1) ∗ log 2
(20) = 4.3219 ∗ (m + 1)
โดยเฉลี่ยm = 80 (40 ย้ายต่อผู้เล่น) ดังนั้นจะใช้เวลา 351 บิตในการเข้ารหัส หากเราบันทึกหลายเกมเราจะต้องใช้การเข้ารหัสสากลเนื่องจากเราไม่ทราบว่าต้องใช้จำนวนบิตเท่าใดในแต่ละหมายเลข
กรณีที่เลวร้ายที่สุดเมื่อm = 400 (200 ย้ายต่อผู้เล่น) ดังนั้นจะใช้เวลา 1734 บิตในการเข้ารหัส
โปรดทราบว่าเราต้องให้ตำแหน่งที่เราต้องการเข้ารหัสผ่านเส้นทางที่สั้นที่สุดเพื่อไปที่นั่นโดยทำตามกฎ ตัวอย่างเช่นเกมที่สร้างทฤษฎีที่นี่ไม่ต้องการm = 11741 เพื่อเข้ารหัสตำแหน่งสุดท้าย แต่เราเรียกใช้การค้นหาแบบกว้างแรกเพื่อค้นหาเส้นทางที่สั้นที่สุดไปยังตำแหน่งนั้นและเข้ารหัสนั้นแทน ฉันไม่รู้ว่าเราจะต้องเจาะลึกตำแหน่งหมากรุกทั้งหมดเท่าไหร่ แต่ฉันคิดว่า 400 เป็นค่าประเมินค่าสูงไป
การคำนวณอย่างรวดเร็ว:
มี 12 ชิ้นไม่ซ้ำกันตารางที่สามารถล้างเพื่อตำแหน่งพวกเขาบนกระดานหมากรุกหรือ 13 64 นี่เป็นค่าประเมินที่สูงเกินไปเนื่องจากมีตำแหน่งที่ไม่ถูกต้องจำนวนมาก เมื่อเราอยู่ม.ย้ายเข้ามาในเกมที่เราได้สร้างขึ้นประมาณ 20 เมตรตำแหน่ง ดังนั้นเราจึงกำลังมองหาเมื่อ 20 เมตร = 13 64 บันทึกทั้งสองด้านเพื่อรับm = 64 * บันทึก20 (13) = 54.797 นี่แสดงให้เห็นว่าเราควรจะไปถึงตำแหน่งใดก็ได้ใน 55 ท่า
ตอนนี้ฉันได้คำนวณกรณีที่แย่ที่สุดที่จะเป็นm = 55 ไม่ใช่m = 400 ฉันจะแก้ไขผลลัพธ์ของฉัน เพื่อเข้ารหัสตำแหน่งที่m = 55 ใช้เวลา 243 บิต ฉันจะบอกว่ากรณีเฉลี่ยอยู่ที่ประมาณm = 40 ซึ่งใช้เวลา 177 บิตในการเข้ารหัส
หากเราใช้อาร์กิวเมนต์การตัดจำหน่ายจากก่อนหน้านี้เรากำลังเข้ารหัส 400 "กระดานหมากรุก" ใน 1734 บิตดังนั้นเราจึงเข้าใจว่า "กระดานหมากรุก" แต่ละอันใช้เวลา 4.335 บิตในกรณีที่เลวร้ายที่สุด
โปรดทราบว่าg = 0 หมายถึงเกมที่ใช้ได้เกมที่ชิ้นส่วนของสี่เหลี่ยมจัตุรัสต่ำสุดเคลื่อนไปยังสี่เหลี่ยมจัตุรัสต่ำสุดที่สามารถทำได้
หมายเหตุเพิ่มเติม:
หากคุณต้องการอ้างถึงตำแหน่งเฉพาะในเกมคุณอาจต้องเข้ารหัสดัชนี สิ่งนี้สามารถเพิ่มได้ด้วยตนเองเช่นเชื่อมดัชนีเข้ากับเกมหรือเพิ่มการย้าย "จบ" เพิ่มเติมเป็นการย้ายครั้งสุดท้ายที่เป็นไปได้ในแต่ละเทิร์น ตอนนี้สามารถบัญชีสำหรับผู้เล่นที่ยอมรับหรือ 2 ในแถวเพื่อแสดงว่าผู้เล่นตกลงที่จะเสมอกัน นี่เป็นสิ่งจำเป็นเฉพาะหากเกมไม่ได้จบในการรุกฆาตหรือจนมุมตามตำแหน่งในกรณีนี้มันจะบอกเป็นนัย ในกรณีนี้มันจะนำจำนวนบิตที่ต้องการโดยเฉลี่ยถึง 356 และในกรณีที่เลวร้ายที่สุด 1762