Ефективне кодування головоломок судоку


16

Визначення будь-якої довільної сітки 9х9 вимагає надання позиції та значення кожного квадрата. Наївне кодування для цього може давати 81 (x, y, значення) триплети, що вимагає 4 біт для кожного x, y та значення (1-9 = 9 значення = 4 біта) на загальну суму 81x4x3 = 972 біт. Пронумерувавши кожен квадрат, можна зменшити інформацію про положення до 7 біт, скинувши трохи за кожен квадрат і загалом 891 біт. Вказавши заздалегідь визначений порядок, можна зменшити це більш різко до лише 4 біт за кожне значення на загальну суму 324 біта. Однак у судоку може бути відсутні цифри. Це забезпечує потенціал для зменшення кількості чисел, які потрібно вказати, але може знадобитися додаткові біти для вказівки позицій. Використовуючи наше 11-бітове кодування (позиція, значення), ми можемо вказати головоломку з підказкамиn11n біт, наприклад мінімальна (17) головоломка вимагає 187 біт. Найкраще кодування, про яке я думав поки що, - використовувати один біт для кожного пробілу, щоб вказати, чи заповнений він, і якщо так, наступні 4 біти кодують число. Для цього потрібно біт, 149 для мінімальної головоломки ( ). Чи існує більш ефективне кодування, бажано без бази даних про кожну дійсну установку судоку? (Бонусні бали для адресації загального з головоломки)81+4nn=17nN×N

Мені просто прийшло в голову, що багато головоломок будуть обертанням іншого або матимуть просту перестановку цифр. Можливо, це може допомогти зменшити потрібні біти.

За даними Вікіпедії ,

Кількість класичних сіток для рішення Судоку 9 × 9 становить 6 670 903 752 072 072 936 960 (послідовність A107739 в OEIS), або приблизно .6.67×1021

Якщо я зробив правильно математику ( ), це виходить 73 (72.498) біти інформації для таблиці пошуку.ln(6,670,903,752,021,072,936,960)ln(2)

Але:

Кількість принципово різних рішень при врахуванні таких симетрій, як обертання, віддзеркалення, перестановка та відновлення, було лише 5,472,730,538 [15] (послідовність A109741 в OEIS).

Це дає 33 (32,35) біта, тому можливо, що розумний метод визначення, яка перестановка для використання могла опуститись нижче повних 73 біт.


1
Так, я спочатку розмістив деякі матеріали, не задумуючись над проблемою. Я його видалив. Чудове запитання!
Patrick87

Чи можете ви нагадати нам, скільки головоломок судоку існує, щоб ми знали, наскільки широкий розрив між цими кодовами, які легко розширюються, і перерахуванням грубої сили?
Жил "ТАК - перестань бути злим"

Потрібно мати можливість кодувати всі сітки, тож вам потрібно 73 біта (припускаючи кодування фіксованої довжини). Жоден «розумний метод вказівки, яку перестановку використовувати» не допоможе вам у цьому. 6.67×1021
svick

@sick З точки зору теорії інформації, я думаю, ви повинні мати рацію, але я не можу зрозуміти, звідки беруться зайві біти. Є перестановки, що становить 19 біт, плюс 3 для дзеркала та обертання, так 22 плюс 33 для унікальних головоломок, становить 55; звідки беруться інші 18? 9!
Кевін

Відповіді:


5

Чи існує більш ефективне кодування, бажано без бази даних про кожну дійсну установку судоку?

Так. Я можу придумати кодування, що покращує ваше 149-бітове кодування мінімальної головоломки в 6 або 9 біт, залежно від умови. Це без бази даних або будь-якого реєстру інших рішень або часткових плат. Ось це іде:9×9

По-перше, ви використовуєте біти для кодування числа m з мінімальною кількістю показів на дошці. Наступні 4 біти кодують фактичне число разів з’являється m . Наступні 7 біт кодують кожне з позицій, в яких з'являється m .4m4m7m

Наступні біти - це прапори, що вказують, чи є в інших позиціях число чи ні (ви просто пропускаєте позиції, в яких m ). Щоразу, коли один з цих бітів є , то наступні 3 біти вказують, яке це число (у впорядкованому наборі { 1 , , 9 } без m ). Наприклад, якщо m = 4 і 3 біти , то число у відповідному положенні на дошці є 5-м (рахуючи від 0) у множині { 1 , 2 , 3 ,81m1{1,,9}mm=4101 , значить, це 6 . Числа j < m будуть кодовані у двійковій формі як j - 1 , тоді як числа j > m будуть кодовані як 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=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

Повне кодування є 01110001010010000000001001010110000000001001000000000001100010110001110000101000001000011110000101000101100100100011000100000000000111001101000, і читач може перевірити, чи дійсно довжина цього рядка 143 :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.