Pengkodean teka-teki sudoku yang efisien

16

Menentukan sewenang-wenang grid 9x9 memerlukan memberikan posisi dan nilai setiap persegi. Sebuah encoding naif untuk ini mungkin memberikan 81 (x, y, nilai) kembar tiga, membutuhkan 4 bit untuk setiap x, y, dan nilai (1-9 = 9 nilai = 4 bit) untuk total 81x4x3 = 972 bit. Dengan penomoran masing-masing persegi, salah satu dapat mengurangi informasi posisi ke 7 bit, menjatuhkan sedikit untuk setiap persegi dan total 891 bit. Dengan menentukan urutan yang telah ditentukan, salah satu dapat mengurangi ini lebih drastis untuk hanya 4 bit untuk setiap nilai untuk total 324 bit. Namun, sudoku dapat memiliki nomor yang hilang. Hal ini memberikan potensi untuk mengurangi jumlah angka yang harus ditentukan, tetapi mungkin memerlukan bit tambahan untuk menunjukkan posisi. Menggunakan encoding 11-bit kami (posisi, nilai), kita dapat menentukan puzzle dengan petunjuk dengan 11n bit, misalnya puzzle (17) minimal membutuhkan 187 bit. Pengkodean terbaik yang saya pikirkan sejauh ini adalah menggunakan satu bit untuk setiap ruang untuk menunjukkan apakah itu terisi dan, jika demikian, 4 bit berikut ini mengkodekan angka tersebut. Hal ini memerlukan 81 + 4 n bit, 149 untuk puzzle minimal ( n = 17 ). Apakah ada pengkodean yang lebih efisien, lebih disukai tanpa database dari setiap pengaturan sudoku yang valid? (Poin bonus untuk mengatasi n umumdari N × N puzzle)11n81+4nn=17nN×N

Itu hanya terjadi kepada saya bahwa banyak teka-teki akan menjadi rotasi lain, atau memiliki permutasi sederhana digit. Mungkin itu bisa membantu mengurangi bit yang diperlukan.

Menurut Wikipedia ,

Jumlah klasik 9 × 9 Sudoku solusi grid adalah 6,670,903,752,021,072,936,960 (urutan A107739 di Oei), atau sekitar .6.67×1021

Jika saya melakukan matematika saya tepat ( ), yang keluar untuk 73 (72,498) bit informasi untuk tabel lookup.ln(6,670,903,752,021,072,936,960)ln(2)

Tapi:

Jumlah dasarnya solusi yang berbeda, ketika simetri seperti rotasi, refleksi, permutasi dan penandaan ulang diperhitungkan, terbukti hanya 5472730538 [15] (urutan A109741 di Oei).

Itu menghasilkan 33 (32,35) bit, jadi ada kemungkinan bahwa metode yang cerdik untuk menunjukkan permutasi yang digunakan bisa sampai di bawah 73 bit penuh.

Kevin
sumber
1
Ha, saya awalnya memposting beberapa hal tanpa memikirkan masalah yang cukup sulit. Saya sudah menghapusnya. Pertanyaan bagus!
Patrick87
Bisakah Anda mengingatkan kami berapa banyak teka-teki Sudoku di sana, jadi kami tahu seberapa lebar jarak antara pengodean yang mudah didekodekan dan enumerasi brutal?
Gilles 'SO- stop being evil'
Anda harus dapat meng-encode semua grid , jadi Anda perlu 73 bit (dengan asumsi pengkodean panjang tetap). Tidak ada "metode pintar untuk menunjukkan permutasi yang digunakan" yang akan membantu Anda. 6.67×1021
svick
@sick Dari sudut pandang teori informasi, saya pikir Anda pasti benar, tetapi saya tidak tahu dari mana bit-bit tambahan itu berasal. Ada permutasi, yaitu 19 bit, ditambah 3 untuk cermin dan rotasi, jadi 22 ditambah 33 untuk teka-teki unik, menghasilkan 55; dari mana 18 lainnya berasal? 9!
Kevin

Jawaban:

5

Apakah ada pengkodean yang lebih efisien, sebaiknya tanpa database masing-masing konfigurasi sudoku valid?

Iya. Saya dapat memikirkan suatu pengkodean yang meningkatkan pengodean 149-bit Anda dari sebuah puzzle 9 × minimal dalam 6 atau 9 bit, tergantung pada suatu kondisi. Ini adalah tanpa database atau register solusi lain atau papan parsial. Ini dia:9×9

Pertama, Anda menggunakan bit untuk mengkodekan sejumlah m dengan jumlah minimal penampilan di papan. Berikutnya 4 bit mengkodekan jumlah sebenarnya kali m muncul. Berikutnya 7 bit mengkodekan setiap posisi di mana m muncul.4m4m7m

Berikut ini bit bendera yang menunjukkan apakah sisa posisi memiliki nomor atau tidak (Anda hanya melewatkan posisi di mana m adalah). Setiap kali salah satu bit ini adalah , maka selanjutnya 3 bit menunjukkan yang nomor itu (di set memerintahkan { 1 , ... , 9 } tanpa m ). Misalnya, jika m = 4 dan 3 bit adalah , maka angka dalam posisi yang sesuai di papan adalah yang ke 5 (dihitung dari 0) di set { 1 , 2 , 3 ,81m1{1,,9}mm=4101 , jadi itu adalah 6 . Angka j < m akan dikodekan dalam biner sebagai j - 1 , sedangkan angka j > m akan dikodekan sebagai j - 2 . Karena kita telah menulisposisi , hanya 3 ( n - ) bit yang akan ditambahkan untuk menyandikan bagian papan yang lain pada langkah ini.{1,2,3,5,6,7,8,9}6j<mj1j>mj23(n)

Dengan demikian, jumlah total bit yang diperlukan untuk mengkodekan papan menggunakan prosedur ini adalah

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

Untuk , kami mencatat bahwa dapat 0 atau 1 (secara umum, n / 9 ). Dengan demikian, B dapat 140 atau 143 tergantung pada apakah ada nomor tidak muncul di papan.n=17n/9B

Patut ditunjukkan bahwa solusi Kevin jauh lebih baik dalam kasus umum. Ini pengkodean menggunakan paling 149 bit hanya untuk , atau untuk n = 20 asalkan = 0 . Setidaknya itu menunjukkan gambaran umum tentang bagaimana untuk mengambil keuntungan dari fakta bahwa N = 9 sangat dekat dengan 2 log 2 N (yang berarti kita cenderung untuk "memory lose" dengan menggunakan 4 bit per nilai, sejak 4 bit memungkinkan kita untuk mengekspresikan N = 16 angka juga.n{17,18,19}n=20=0N=92log2NN=16


Contoh. Pertimbangkan papan berikut dengan petunjuk.n=17

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

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

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

Di sini, tidak ada nomor tidak muncul di papan tulis, dan angka 6, 7 dan 9 hanya muncul sekali. Kami mengambil ( ) dan = 1 ( ). Membaca posisi dari kiri ke kanan dan kemudian dari atas ke bawah, m muncul di posisi 36 ( ). Dengan demikian, encoding kami dimulai dengan .m=70111=10001m360100100011100010100100

0110140000000100101100m=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

Pengkodean lengkap adalah 01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000, dan pembaca dapat memeriksa panjang string itu memang 143 :-)

Janoma
sumber