Min: 0 bit
Maks: 1734 243 bit (4.335 4,401 bit / papan diamortisasi)
Diharapkan: 351 177 bit (4.376 4.430 bit / papan diamortisasi)
Karena saya dapat menentukan input dan output namun saya ingin saya memutuskan untuk pergi dengan menyandikan sejarah permainan hingga saat ini. Satu keuntungan adalah bahwa informasi tambahan tentang siapa yang mengubahnya, en-passant, dan siapa yang memiliki kemampuan untuk kastil di mana dapat diturunkan dan tidak dikodekan.
Percobaan 1:
Secara naif saya berpikir bahwa saya dapat mengkodekan setiap gerakan dalam 12 bit, 4 triplet dari bentuk (mulai x, mulai y, akhir x, akhir y) di mana masing-masing 3 bit.
Kami akan mengasumsikan posisi awal dan memindahkan potongan dari sana dengan putih akan menjadi yang pertama. Papan disusun sedemikian rupa sehingga (0, 0) adalah sudut kiri bawah putih.
Misalnya gim:
e4 e5
Nf3 f6
Nxe5 fxe5
... ...
Akan dikodekan sebagai:
100001 100010 100110 100100
110000 101010 101110 101101
101010 100100 101101 100100
...
Ini mengarah ke pengkodean 12 m bit di mana m adalah jumlah gerakan yang dilakukan
Di satu sisi ini bisa benar-benar besar, di sisi lain Anda dapat mempertimbangkan setiap langkah untuk menjadi itu game sendiri sehingga setiap encoding benar-benar mengkodekan m "papan catur". Jika Anda diamortisasi ini Anda mendapatkan bahwa setiap "papan catur" adalah 12 bit. Tapi saya merasa ini sedikit curang ...
Percobaan 2:
Saya menyadari bahwa setiap gerakan dalam upaya sebelumnya menyandikan banyak gerakan ilegal. Jadi saya memutuskan untuk hanya menyandikan langkah hukum. Kami menghitung langkah yang mungkin sebagai berikut, beri angka setiap kuadrat sedemikian sehingga (0, 0) → 0, (1, 0) → 1, (x, y) → x + 8 y. Iterasi melalui ubin dan periksa apakah ada sepotong dan apakah itu bisa bergerak. Jika demikian, tambahkan posisi yang dapat dituju ke daftar. Pilih indeks daftar yang merupakan langkah yang ingin Anda buat. Tambahkan nomor itu ke total gerakan yang dibobot oleh 1 ditambah jumlah gerakan yang mungkin.
Contoh seperti di atas: Dari posisi awal, potongan pertama yang bisa bergerak adalah ksatria di kotak 1, bisa bergerak ke kotak 16 atau 18, jadi tambahkan itu ke daftar [(1,16),(1,18)]
. Berikutnya adalah ksatria di kotak 6, tambahkan gerakannya. Secara keseluruhan kami mendapatkan:
[(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)]
Karena kami menginginkan gerakan (12, 28), kami menyandikan ini sebagai 13 di basis 20 karena ada 20 kemungkinan gerakan.
Jadi sekarang kita mendapatkan nomor g g
=
0
Selanjutnya kita melakukan hal yang sama untuk hitam kecuali kita memberi nomor ubin secara terbalik (untuk membuatnya lebih mudah, tidak diperlukan) untuk mendapatkan daftar langkah:
[(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)]
Karena kami menginginkan gerakan (11, 27), kami menyandikan ini sebagai 11 di basis 20 karena ada 20 kemungkinan gerakan.
Jadi sekarang kita mendapatkan nomor g permainan 1
= (11 ⋅ 20) + 13 = 233
Selanjutnya kita mendapatkan daftar langkah untuk putih:
[(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)]
Karena kami menginginkan gerakan (6, 21), kami menyandikan ini sebagai 13 di basis 29 karena ada 29 kemungkinan gerakan.
Jadi sekarang kita mendapatkan nomor permainan g 2
= ((13 ⋅ 20) + 11) 20 + 13 = 5433
Selanjutnya kita mendapatkan daftar langkah untuk hitam:
[(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)]
Karena kami ingin pindah $ (10, 18) $ (10, 18)
Jadi sekarang kita mendapatkan nomor g permainan 3
= (((19 ⋅ 29 + 13) 20) + 11) 20 + 13 = 225833
Dan lanjutkan proses ini untuk semua gerakan yang tersisa. Anda dapat menganggap g sebagai fungsi g (x, y, z) = x y + z. Jadi 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)
Untuk memecahkan kode nomor g permainan 0 , kita mulai dari posisi awal dan menghitung semua gerakan yang mungkin. Kemudian kita menghitung g 1 = g 0 // l , m 0 = g 0 % l , di mana l adalah jumlah gerakan yang mungkin, '//' adalah operator pembagian integer dan '%' adalah operator modulus. Seharusnya menyatakan bahwa g 0 = g 1 + m 0 . Selanjutnya kita buat langkah m 0 dan ulangi.
Dari contoh di atas jika g 0 = 225833 maka g 1 = 225833 // 20 = 11291 dan m 0 = 225833% 20 = 13. Selanjutnya g 2 = 11291 // 20 = 564 dan m 1 = 11291% 20 = 11. Kemudian g 3 = 11291 // 20 = 564 dan m 2 = 11291% 20 = 11. Karena itu g 4 = 564 // 29 = 19 dan_m_ 3 = 564% 29 = 13. Akhirnya g 5 = 19 // 29 = 0 dan m 4 = 19% 29 = 19.
Jadi berapa banyak bit yang digunakan untuk meng-encode game dengan cara ini?
Untuk kesederhanaan, katakanlah selalu ada 20 gerakan setiap belokan dan untuk skenario terburuk kita selalu memilih yang terbesar, 19. Angka yang akan kita dapatkan adalah 19 ⋅ 20 m
+ 19 ⋅ 20 m-1
+ 19 ⋅ 20 m-2
+ ⋯ + 19 ⋅ 20 + 19 = 20 m + 1
- 1 di mana _m adalah jumlah gerakan. Untuk mengkodekan 20 m + 1
- 1 kita membutuhkan sekitar log 2
(20 m + 1
) bit yang kira-kira (m + 1) ∗ log 2
(20) = 4,3219 ∗ (m + 1)
Rata-rata m = 80 (40 gerakan per pemain) sehingga ini akan membutuhkan 351 bit untuk dikodekan. Jika kami merekam banyak permainan, kami akan memerlukan pengodean universal karena kami tidak tahu berapa banyak bit yang dibutuhkan setiap angka
Kasus terburuk saat m = 400 (200 bergerak per pemain) jadi ini akan membutuhkan 1734 bit untuk dikodekan.
Perhatikan bahwa posisi yang ingin kita encode harus diberikan kepada kita melalui jalur terpendek untuk sampai ke sana dengan mengikuti aturan. Misalnya permainan berteori di sini tidak perlu m = 11741 untuk menyandikan posisi akhir. Alih-alih, kami menjalankan pencarian Breadth-First untuk menemukan jalur terpendek ke posisi itu dan menyandikannya. Saya tidak tahu seberapa dalam kita perlu menghitung semua posisi catur, tapi saya curiga 400 itu terlalu tinggi.
Perhitungan cepat:
Ada 12 buah unik atau kotak bisa kosong sehingga untuk menempatkannya di papan catur adalah 13 64 . Ini adalah perkiraan yang terlalu besar karena mencakup banyak posisi yang tidak valid. Ketika kita m bergerak ke dalam permainan yang telah kita buat sekitar 20 m posisi. Jadi kami mencari ketika 20 m = 13 64 . Log kedua sisi untuk mendapatkan m = 64 * log 20 (13) = 54.797. Ini menunjukkan bahwa kita harus dapat mencapai posisi apa pun dalam 55 gerakan.
Sekarang saya menghitung kasus terburuk menjadi m = 55 bukan m = 400, saya akan mengedit hasil saya. Untuk menyandikan posisi di mana m = 55 membutuhkan 243 bit. Saya juga akan mengatakan bahwa case rata-rata sekitar m = 40 yang membutuhkan 177 bit untuk dikodekan.
Jika kita menggunakan argumen amortisasi dari sebelumnya, kita mengkodekan 400 "papan catur" dalam 1734 bit sehingga kita mendapatkan bahwa setiap "papan catur" mengambil 4,335 bit dalam kasus terburuk.
Perhatikan bahwa g = 0 menunjukkan gim yang valid, gim di mana potongan pada kuadrat terendah bergerak ke kuadrat terendah.
Catatan tambahan:
Jika Anda ingin merujuk ke posisi tertentu dalam permainan, Anda mungkin perlu menyandikan indeks. Ini dapat ditambahkan baik secara manual misalnya menggabungkan indeks ke permainan, atau menambahkan gerakan "akhir" tambahan sebagai langkah terakhir yang mungkin dilakukan setiap belokan. Ini sekarang dapat menjelaskan kebobolan pemain, atau 2 berturut-turut untuk menunjukkan bahwa para pemain menyetujui pengundian. Ini hanya diperlukan jika permainan tidak berakhir dengan skakmat atau kebuntuan berdasarkan posisi, dalam hal ini tersirat. Dalam hal ini ia membawa jumlah bit yang dibutuhkan rata-rata menjadi 356 dan dalam kasus terburuk 1762.