การเข้ารหัสปริศนาซูโดกุที่มีประสิทธิภาพ


16

การระบุกริด 9x9 ใด ๆ จำเป็นต้องให้ตำแหน่งและค่าของแต่ละช่อง การเข้ารหัสnaïveสำหรับสิ่งนี้อาจให้ 81 (x, y, ค่า) triplets ต้องใช้ 4 บิตสำหรับแต่ละ x, y และค่า (1-9 = 9 ค่า = 4 บิต) รวมเป็น 81x4x3 = 972 บิต ด้วยการกำหนดหมายเลขแต่ละช่องสี่เหลี่ยมเราสามารถลดข้อมูลตำแหน่งเป็น 7 บิตปล่อยบิตสำหรับแต่ละตารางและรวม 891 บิต โดยการระบุคำสั่งที่กำหนดไว้ล่วงหน้าหนึ่งสามารถลดลงอย่างมากนี้เป็นเพียง 4 บิตสำหรับแต่ละค่ารวม 324 บิต อย่างไรก็ตามซูโดกุอาจมีตัวเลขที่ขาดหายไป นี่เป็นโอกาสที่จะลดจำนวนตัวเลขที่ต้องระบุ แต่อาจต้องใช้บิตเพิ่มเติมเพื่อระบุตำแหน่ง การใช้การเข้ารหัส 11 บิตของเรา (ตำแหน่งค่า) เราสามารถระบุตัวต่อด้วยเบาะแสกับ11n Nปริศนา)11nบิตเช่นตัวต่อน้อยที่สุด (17) ตัวต้องใช้ 187 บิต การเข้ารหัสที่ดีที่สุดที่ฉันเคยคิดว่าจะใช้หนึ่งบิตสำหรับแต่ละช่องว่างเพื่อระบุว่าเต็มแล้วหรือไม่และถ้าเป็นเช่นนั้น 4 บิตต่อไปนี้จะเข้ารหัสหมายเลข สิ่งนี้ต้องใช้บิต 149 สำหรับจิ๊กซอว์ขั้นต่ำ ( n = 17 ) มีการเข้ารหัสที่มีประสิทธิภาพมากกว่าหรือไม่หากไม่มีฐานข้อมูลของการตั้งค่า sudoku ที่ถูกต้องแต่ละครั้ง (คะแนนโบนัสสำหรับการพูดถึงnทั่วไปจากN ×81+4nn=17nN×N

มันเพิ่งเกิดขึ้นกับฉันว่าปริศนาจำนวนมากจะเป็นการหมุนของปริศนาอื่นหรือมีการเปลี่ยนตัวเลขอย่างง่าย บางทีนั่นอาจช่วยลดบิตที่ต้องการได้

ตามที่ วิกิพีเดีย ,

จำนวนกริดการแก้ปัญหาซูโดกุแบบคลาสสิก 9 × 9 คือ 6,670,903,752,021,072,936,960 (ลำดับ A107739 ใน OEIS) หรือประมาณ6.67×1021 21

ถ้าผมทำถูกคณิตศาสตร์ของฉัน ( ) ซึ่งมีข้อมูล 73 บิต (72.498) บิตสำหรับตารางการค้นหาln(6,670,903,752,021,072,936,960)ln(2)

แต่:

จำนวนของวิธีการแก้ปัญหาที่แตกต่างกันอย่างมีนัยสำคัญเมื่อสมมาตรเช่นการหมุนการสะท้อนการเปลี่ยนแปลงและการ relabelling ถูกนำมาพิจารณาแสดงให้เห็นว่าเป็นเพียง 5,472,730,538 [15] (ลำดับ A109741 ใน OEIS)

นั่นให้บิต 33 (32.35) ดังนั้นจึงเป็นไปได้ที่วิธีการที่ฉลาดในการระบุว่าการเปลี่ยนรูปแบบที่ใช้จะต่ำกว่า 73 บิตเต็ม


1
ฮ่าฉันเริ่มโพสต์บางสิ่งโดยไม่คิดถึงปัญหาหนักพอ ฉันได้ลบมัน เป็นคำถามที่ดีมาก!
Patrick87

คุณสามารถเตือนเราได้ว่ามีปริศนาซูโดกุกี่ตัวดังนั้นเราจึงรู้ว่าช่องว่างกว้างระหว่างการเข้ารหัสที่ถอดรหัสได้ง่ายเหล่านี้และการแจงนับอย่างดุร้าย
Gilles 'หยุดความชั่วร้าย'

คุณต้องสามารถเข้ารหัสกริดทั้งหมดดังนั้นคุณต้องมี 73 บิต (สมมติว่าการเข้ารหัสความยาวคงที่) ไม่มี "วิธีการที่ชาญฉลาดในการบ่งชี้ว่าการเปลี่ยนแปลงที่จะใช้" จะช่วยคุณได้ 6.67×1021
svick

@sick จากมุมมองของทฤษฎีข้อมูลฉันคิดว่าคุณต้องพูดถูก แต่ฉันไม่สามารถรู้ได้ว่าบิตพิเศษมาจากไหน มีพีชคณิตซึ่งคือ 19 บิตบวก 3 สำหรับกระจกและการหมุนดังนั้น 22 บวก 33 สำหรับปริศนาที่ไม่ซ้ำกันทำให้ 55; อีก 18 คนมาจากไหน 9!
Kevin

คำตอบ:


5

มีการเข้ารหัสที่มีประสิทธิภาพมากกว่าหรือไม่หากไม่มีฐานข้อมูลของการตั้งค่า sudoku ที่ถูกต้องแต่ละครั้ง

ใช่. ฉันจะคิดว่าการเข้ารหัสการปรับปรุงการเข้ารหัส 149 บิตของคุณน้อยที่สุดปริศนาใน 6 หรือ 9 บิตขึ้นอยู่กับเงื่อนไข นี่คือไม่มีฐานข้อมูลหรือการลงทะเบียนของการแก้ปัญหาอื่น ๆ หรือบอร์ดบางส่วน นี่มันไป:9×9

ขั้นแรกให้คุณใช้บิตในการเข้ารหัสตัวเลขmด้วยจำนวนรูปลักษณ์ที่น้อยที่สุดในกระดาน ถัดไป4บิตเข้ารหัสจำนวนจริงครั้งmปรากฏ 7 บิตถัดไปเข้ารหัสแต่ละตำแหน่งที่ปรากฏm4m4m7m

บิตต่อไปนี้เป็นแฟล็กที่ระบุว่าตำแหน่งที่เหลือมีตัวเลขหรือไม่ (คุณเพียงแค่ข้ามตำแหน่งที่mอยู่) เมื่อใดก็ตามที่หนึ่งในบิตเหล่านี้คือจากนั้น3 บิตถัดไประบุว่าเป็นจำนวนใด (ในชุดที่สั่ง{ 1 , , 9 }โดยไม่มีm ) ตัวอย่างเช่นถ้าm = 4และ 3 บิตอยู่ดังนั้นตัวเลขในตำแหน่งที่สอดคล้องกันบนกระดานคืออันดับที่ 5 (นับจาก 0) ในชุด{ 1 , 2 , 3 ,81m1{1,,9}mm=4101ดังนั้นจึงเป็นที่6 เบอร์เจ< ม.จะได้รับการเข้ารหัสในไบนารีเป็น J - 1 , ในขณะที่ตัวเลข J > ม.จะได้รับการเข้ารหัสเป็นเจ- 2 เนื่องจากเราได้เขียนตำแหน่งแล้วมีเพียง 3 ( n - ){1,2,3,5,6,7,8,9}6j<mj1j>mj23(n)จะมีการเพิ่มบิตเพื่อเข้ารหัสส่วนที่เหลือของบอร์ดในขั้นตอนนี้

ดังนั้นจำนวนของบิตที่จำเป็นในการเข้ารหัสคณะกรรมการโดยใช้ขั้นตอนนี้เป็น

B=4+4+7+(81)+3(n)=89+3+3n.

สำหรับเราทราบว่าสามารถเป็น 0 หรือ 1 (โดยทั่วไปn / 9 ) ดังนั้นBสามารถเป็น 140 หรือ 143 ขึ้นอยู่กับว่ามีตัวเลขที่ไม่ปรากฏบนกระดานn=17n/9B

เป็นมูลค่าชี้ให้เห็นว่าการแก้ปัญหาของเควินเป็นวิธีที่ดีกว่าในกรณีทั่วไป นี้ใช้การเข้ารหัสที่มากที่สุด 149 บิตเฉพาะสำหรับหรือn = 20โดยมีเงื่อนไขว่า= 0 อย่างน้อยก็แสดงให้เห็นถึงแนวคิดทั่วไปเกี่ยวกับวิธีการใช้ประโยชน์จากข้อเท็จจริงที่ว่าN = 9นั้นใกล้กับ2 log 2 N ⌋มาก (ซึ่งหมายความว่าเรามักจะ "สูญเสียความจำ" โดยใช้ 4 บิตต่อค่าตั้งแต่ 4 บิตอนุญาต เราสามารถแสดงตัวเลขN = 16 ได้เช่นกันn{17,18,19}n=20=0N=92log2NN=16


ตัวอย่าง. พิจารณาบอร์ดต่อไปนี้ด้วยปมn=17

.  .  .   .  .  .   .  1  .
4  .  .   .  .  .   .  .  .
.  2  .   .  .  .   .  .  .

.  .  .   .  5  .   4  .  7
.  .  8   .  .  .   3  .  .
.  .  1   .  9  .   .  .  .

3  .  .   4  .  .   2  .  .
.  5  .   1  .  .   .  .  .
.  .  .   8  .  6   .  .  .

ที่นี่ไม่มีหมายเลขไม่ได้ปรากฏบนกระดานและหมายเลข 6, 7 และ 9 ปรากฏเพียงครั้งเดียว เรารับ ( ) และ= 1 ( ) การอ่านตำแหน่งจากซ้ายไปขวาแล้วจากบนลงล่างmปรากฏในตำแหน่งที่36 (m=70111=10001m360100100 ) 011100010100100ดังนั้นการเข้ารหัสของเราเริ่มต้นด้วย

ต่อไปเราต้องการเจ็ด0s หนึ่ง1และ 3 บิตการเข้ารหัสของหมายเลขจากนั้นตามด้วย a และ 3-bit การเข้ารหัส4 , ฯลฯ ( ) ในที่สุดเราจะข้ามตำแหน่งที่ม. = 7เป็นและเราจะเข้ารหัส 8 (นับจากวันที่ 6 จำนวน 0 ในรายการ1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 ) และ 9 เป็น การเข้ารหัสเต็มรูปแบบจะเป็นดังนี้:10140000000100101100m=71101,2,3,4,5,6,8,9111

// m=7, l=1 and its position on the board.
011100010100100
// Numbers 1 and 4 at the beginning. Note that 1 is encoded 000, and 4 is 011.
0000000100001011
// Numbers 2 and 5.
0000000001001000000000001100
// Numbers 4 and 8. We skip the appearance of 7 and encode 8 as 110.
010110001110
// 3, 1 and 9. 9 is encoded as 111.
00010100000100001111
// 3, 4, 2, 5, 1, 8, 6 and the last empty cells.
0000101000101100100100011000100000000000111001101000

การเข้ารหัสที่สมบูรณ์คือ01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000และผู้อ่านสามารถตรวจสอบความยาวของสตริงนั้นได้ 143 :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.