Мінімум: 0 біт
Макс: 1734 рік 243 біта (4.335 4.401 біт / амортизована плата)
Очікується: 351 177 біт (4.376 4.430 біт / амортизована плата)
Оскільки я можу визначити вхід і вихід, проте я хочу, щоб я вирішив перейти до кодування історії гри до цього моменту. Однією з переваг є те, що додаткова інформація про те, хто її черга, всебічний та хто має можливість замовити там, де його можна отримати, а не закодувати.
Спроба 1:
Наївно я подумав, що можу кодувати кожен хід у 12 біт, 4 трійки форми (початок х, початок у, кінець х, кінець у), де кожен - 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 - кількість можливих переміщень, '//' - оператор цілочисельного поділу і '%' - оператор модуля. Має бути встановлено, що g 0 = g 1 + m 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 і_m_ 3 = 564% 29 = 13. Нарешті g 5 = 19 // 29 = 0 і m 4 = 19% 29 = 19.
Так скільки бітів використовується для кодування гри таким чином?
Для простоти, скажімо, завжди є 20 рухів на кожному повороті, а для найгіршого сценарію ми завжди вибираємо найбільший, 19. Число, яке ми отримаємо, становить 19 ⋅ 20 м
+ 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 * log 20 (13) = 54.797. Це показує, що ми повинні мати можливість дістатись до будь-якої позиції за 55 рухів.
Тепер, коли я обчислив найгірший випадок, коли m = 55 не m = 400, я відредагую свої результати. Для кодування позиції, де m = 55 займає 243 біта. Я також скажу, що середній випадок становить близько m = 40, що кодує 177 біт.
Якщо ми використовуємо аргумент амортизації раніше, ми кодуємо 400 «шахових дощок» у 1734 бітах, тож ми отримуємо, що кожна «шахова дошка» займає 4,335 біт у гіршому випадку.
Зауважте, що g = 0 позначає дійсну гру, ту, де шматок на нижньому квадраті переміщується до найнижчого квадрата, який він може.
Додаткові нотатки:
Якщо ви хочете вказати певну позицію в грі, можливо, вам знадобиться кодувати індекс. Це можна додати або вручну, наприклад, об'єднати індекс у гру, або додати додатковий хід "кінця" як останній можливий хід кожного кроку. Тепер це може призвести до того, що гравці поступилися, або 2 поспіль, щоб позначити гравців, які погодилися на нічию. Це необхідно лише в тому випадку, якщо гра не закінчилася маткою чи тупиком на основі позиції, в цьому випадку це мається на увазі. У цьому випадку кількість бітів, необхідних в середньому, становить 356, а в гіршому - 1762.