Tulis algoritma atau program yang dapat menyandikan dan mendekode papan catur. Tujuannya adalah untuk membuat representasi terkecil dari papan catur yang dapat digunakan (setelah diterjemahkan) untuk menentukan semua kemungkinan pergerakan pemain pada giliran itu.
Pengkodean harus dapat menunjukkan:
- Giliran siapa itu.
- Apakah pemain dapat melakukan kastil di setiap sisi.
- Apakah pemain dapat melakukan en-passant, dan jika demikian, mana dari pion mereka?
- Posisi semua bagian.
Catatan penting tentang kastil: Jika putih menggerakkan raja mereka satu putaran, dan kemudian memindahkannya kembali berikutnya, harus jelas bahwa mereka tidak dapat kastil di kedua sisi setelah itu. Hal yang sama akan terjadi jika mereka memindahkan benteng kiri atau kanan mereka. Meskipun papan secara visual dalam keadaan yang sama seperti dua belokan yang lalu, kondisi permainan telah berubah. Info lebih lanjut di sini: http://en.wikipedia.org/wiki/Chess#Castling
Catatan penting pada en-passant: Ini juga merupakan langkah yang peka terhadap belokan. Baca aturan untuk info lebih lanjut. http://en.wikipedia.org/wiki/Chess#En_passant
Tentukan input dan output sesuai kebutuhan. Alat peraga utama bagi siapa pun yang paling bisa mengompresnya!
Skor Anda ditentukan skenario terburuk - ukuran maksimum yang mungkin dalam bit. Pastikan Anda menunjukkan bagaimana Anda menghitungnya nomor itu dan apa yang Anda perhitungkan. Tembak untuk kasus terburuk terkecil!
sumber
Jawaban:
Min: 12 bit
Maks:
Rata-rata:
Pernah dan berpikir semalam bahwa saya mungkin bisa membuatnya lebih kecil.
Hasilnya adalah ukuran 12 bit yang mengesankan !
Jadi bagaimana dengan K +1 jenis karya lainnya?
Ada 2 kemungkinan pengaturan sub tree.
Keduanya menghasilkan ukuran bit yang sama untuk semua bagian. Jadi tidak ada bedanya dengan yang kami gunakan, saya akan memilih yang pertama.
Jadi pada Raja +2 jenis potongan lainnya
Ada 5 kemungkinan sub pohon (saya akan menggunakan 1 dan 2 untuk menunjukkan yang mana dari potongan-potongan itu.)
Jadi kita akan membutuhkan 3 bit untuk mengkodekan sub pohon mana yang akan digunakan.
Masih melakukan analisis untuk lebih banyak potongan
+3 Lainnya
+4 Lainnya
+5 Lainnya
Maks: 208?
Apakah mungkin untuk menyandikan semua sub-pohon ini menjadi 9 bit?
Jika kami totalkan semua sub-pohon yang memungkinkan, kami mendapatkan 392 sub-pohon yang memungkinkan.
Menggunakan ID Freq
Karena ada 164603 frekuensi potongan unik .
(+000) (+00) Castling
Maks: = 204 bit
rev 3
Min: 82 Maks: 199 Rata-rata: 160
Akhirnya sempat melakukan beberapa analisis untuk menemukan ukuran bit maksimum. Dengan pengodean huffman yang optimal untuk masing-masing frekuensi potongan unik .
Perhatikan ini adalah ukuran terburuk yang mungkin, yang kolom En-Passant menggigit jika jumlah pion lebih besar dari satu. Terlepas dari warna-warna pion dan posisi ada potensi untuk beberapa papan menjadi 3 bit lebih kecil.
Juga hanya ada 144 ukuran berbeda (kasus terburuk) untuk ukuran papan.
75 - 216 bit (v2) v1 Ukuran minimum adalah 98 bit (12,25 byte), hanya dua raja di papan tulis.
Ukuran maksimum hanya 216 bit (27 byte.) Dalam tidak suka: -
Rata-rata ukurannya sekitar 157 bit (19,625 byte).
Potongan
Untuk menyandikan papan, saya menggunakan skema penyandian pohon biner. Kotak kosong adalah yang paling sering dari mana saja antara 32 dan 62 penampilan. Berikutnya adalah bidak, kemudian Benteng, Ksatria, Uskup dan yang paling jarang adalah Ratu dan Raja.
Papan awal dapat dikodekan hanya dalam 166 bit (20,75 byte)
Untuk menunjukkan siapa yang pindah hanya perlu satu bit
Castling dapat dikodekan dalam 4 bit.
Jadi saya sudah menggunakan 171 bit (21,375 byte)
En-Passe dapat dikodekan menjadi hanya 16 bit (2 byte)
Jadi totalnya 187 bit (23,375 byte).
Tata letak
Belum menulis kode apa pun.
Perhatikan bahwa 3 bit yang tidak digunakan. Jadi maksnya adalah 213bits .
Kemungkinan Perbaikan
1) Mengurangi bentuk blok header 24 hingga 8 bit (dengan saran @Peter Taylor)
2) Header panjang variabel
Header kecil 4 bit yang diperbaiki
Blok bit tambahan berikutnya (Jika castling masih memungkinkan)
Blok bit tambahan berikutnya (jika ada pion)
Jadi sekarang saya memiliki header panjang variabel 4 - 11 bit
3) Gunakan skema penyandian yang berbeda tergantung pada bagian yang tersisa di papan tulis.
Dengan mengubah pengkodean pohon tergantung pada potongan apa yang ada di papan dan ada frekuensi.
Satu kemungkinan penyandian untuk kondisi akhir game (No Pawns)
Yaitu sekitar ~ 4 bit per potong.
Jenis potongan apa yang ada di papan tulis?
Permutasi adalah Panjang variabel 0-5 bit. Jika hanya satu jenis potongan yang tersisa maka jangan memasukkannya.
Permutasi potongan mana yang digunakan untuk pohon? Ini adalah faktorial dari jumlah potongan dalam contoh di atas itu adalah 5 buah sehingga 120 kemungkinan permutasi yang dapat dikodekan.
Ingat bahwa ada bit tambahan untuk kotak dan warna kosong.
Contohnya
Mari kita beri contoh hanya QK yang tersisa
Total 81 bit
Mari kita beri dan contoh hanya raja yang tersisa
Satukan semuanya
Jadi saya menghitung encoding terkecil untuk papan di 75bits (9 bit 3 bit)
Masih belum menghitung bagaimana skema pengkodean ini memengaruhi ukuran maksimum.
Perbaikan 4
Kurangi jumlah bit untuk castling menjadi hanya 2 bit. Hanya castling untuk pemain yang giliran itu.
Kalau dipikir-pikir, mungkin lebih baik memasukkan 2 bit ke dalam blok header.
sumber
1111
untuk "tidak boleh lewat" atau kolom sebagai nomor biner sebaliknya).192 bit (kasus terburuk)
Berikut adalah skema penyimpanan yang sangat sederhana yang harus mengatasi promosi gadai yang sewenang-wenang, dan tidak pernah membutuhkan lebih dari 64 + 4 × 32 = 192 bit:
64 bit pertama menyimpan bitboard yang memberi tahu di mana keping-keping itu (tetapi tidak apa adanya). Yaitu, kami menyimpan satu bit untuk setiap kuadrat papan catur (mulai dari kuadrat a1, kemudian b1, c1, dll. Hingga kuadrat h8) sedemikian rupa sehingga kuadrat kosong diwakili oleh 0 dan kuadrat terisi oleh 1.
Selanjutnya, untuk masing-masing kotak yang ditandai ditempati di papan bit, kami menyimpan 4-bit nibble yang menyandikan potongan di kotak itu. Yang pertama dari empat bit mengkodekan warna potongan (0 = putih, 1 = hitam), sedangkan tiga bit sisanya mengkodekan jenis potongan:
Perhatikan dua penyandian untuk raja, yang digunakan untuk menentukan giliran pemain mana yang akan dipindahkan. (Faktanya, karena selalu ada dua raja di papan tulis, memungkinkan untuk empat kombinasi kode 5 dan 6, kita dapat dengan mudah menyandikan sedikit informasi kedua di sini.)
Untuk menyandikan informasi tambahan yang diperlukan untuk aturan en castant dan castling, kami memperkenalkan satu jenis keping tambahan, yang menunjukkan pion atau benteng tergantung pada baris yang muncul pada:
Menyatukan semuanya:
Total jumlah bit yang diperlukan untuk mengkodekan keadaan papan adalah 64 + 4 × # dari potongan-potongan di papan. Karena tidak akan pernah ada lebih dari 32 buah di papan tulis, panjang maksimum penyandian ini adalah 192 bit.
Misalnya, menggunakan pengkodean yang dijelaskan di atas, keadaan awal papan akan dikodekan sebagai (spasi kosong dimasukkan untuk dibaca):
atau, dalam heksadesimal:
sumber
Kasus terburuk 160 bit
Setelah memposting jawaban saya sebelumnya 22 byte, saya mulai bertanya-tanya apakah kita bisa turun ke 21 byte. Namun ketika saya melihat 166 byte Peter Taylor yang luar biasa saya pikir, "Tunggu, sepertinya lima kata 32-bit bisa dibuat!"
Jadi setelah cukup banyak berpikir, saya datang dengan ini: 159.91936391 bytes (cocok cukup ketat!) Tingkat kompresi ini akan memerlukan program yang cukup rumit tetapi saya telah memikirkan bagaimana membuatnya berjalan dalam waktu yang wajar.
Ini akan menjadi posting yang panjang, jadi tolong bersabar, saya akan memposting apa yang saya bisa hari ini dan menambahkan beberapa bit kode segera.
Jadi, inilah cara melakukannya:
En Passant and castling dikodekan oleh posisi ilegal (0 bit)
Sambil lalu
Seperti disebutkan dalam jawaban lain, ada maksimal 5 kotak yang memungkinkan pion rentan terhadap en passant dapat berdiri. Ini adalah kotak di sebelah pion pemain yang gilirannya.
Untuk menyandikan ini, pion yang rentan terhadap en passant dipertukarkan dengan apa pun yang ada di salah satu kotak di baris pertama atau terakhir. Ini bisa berupa laki-laki atau kotak kosong. Ini menghasilkan posisi ilegal, karena pion tidak dapat berada di baris ini. Decoder harus mengembalikan pion ke posisi yang benar, mengekstraksi informasi yang lewat.
Agar hal ini tidak mengganggu pengkodean castling, penting bahwa kotak-kotak di mana raja berdiri pada awal permainan tidak terganggu, dan bahwa prosedur enkode en passant tidak menempatkan raja di samping satu sama lain, yang akan menjadi posisi raja ilegal. Untuk memenuhi poin kedua, pembuat enkode memiliki dua pilihan kuadrat mana yang dipertukarkan dengan pion en passant. Kuadrat pilihan pertama untuk masing-masing hingga 5 pion adalah A8, B8, C8, G8, H8. Pilihan kedua: A1, B1, C1, G1, H1.
Castling
Seorang raja yang diizinkan untuk kastil menurut definisi, masih di alun-alun awal. Dengan raja putih di alun-alun awal, ada total 63 kotak di mana raja hitam bisa berdiri, 58 di antaranya legal (dia tidak diizinkan untuk bergerak tepat di sebelah raja putih karena dia akan menempatkan dirinya dalam kendali.) Jika raja kulit putih diizinkan untuk benteng, ia juga diizinkan untuk benteng dengan benteng kirinya, benteng kanannya, atau keduanya. Dengan demikian ada 3x58 = 174 kemungkinan di mana raja putih dapat kastil, 174 lainnya di mana raja hitam dapat kastil, dan 3x3 = 9 lebih lanjut di mana keduanya dapat kastil, total 357.
Ada 420 pengaturan ilegal dari dua raja di mana mereka berada di kotak yang berdekatan: 3x4 = 12 ketika raja putih di sudut, 5x24 = 120 ketika dia berada di tepi, dan 8x36 = 288 ketika dia berada di alun-alun lainnya. Oleh karena itu ada posisi ilegal yang cukup mudah untuk menyandikan semua kemungkinan kemungkinan castling.
Jika setidaknya satu raja diizinkan untuk kastil, pembuat enkode akan mencari data kastil dan data posisi raja-raja yang tidak diizinkan untuk kastil dalam sebuah tabel (atau sebagai alternatif, gunakan algoritma yang tidak akan saya sebutkan di sini) dan menghasilkan ilegal posisi kedua raja. Kemudian akan bertukar raja dengan apa pun yang terjadi pada kotak ini.
Adalah penting bahwa ini dikodekan setelah dan diterjemahkan sebelum en passant, jika tidak ada beberapa gangguan potensial.
Perbandingan
Jadi, sejauh ini saya tidak menggunakan bit! Melihat jawaban Peter, saya masih memiliki yang berikut untuk dikodekan:
Ini untuk kasus terburuk dari 29 pria (lihat jawaban Peter.) Di bawah ini saya akan menunjukkan bagaimana saya membuat perbaikan kecil (setidaknya untuk kasus 29 pria) pada kedua poin yang ditandai **.
Kotak mana yang ditempati / giliran siapa?
Cara mudah untuk menyandikan kotak mana yang ditempati adalah dengan kotak 64 bit. Ini juga memberi tahu kami berapa banyak kotak yang ditempati. Namun agak boros karena tidak mungkin ada lebih dari 32 kotak. Solusi saya adalah dengan menggunakan 1 untuk mengkodekan untuk kotak yang ditempati ketika giliran Putih dan 0 untuk mengkodekan untuk kotak yang ditempati saat giliran Hitam. Sekarang semua kombinasi digunakan dan tidak ada limbah.
Jadi kita menghemat sedikit untuk menyimpan belokan: kurang dari 32 1, giliran putih, lebih dari 32 1, giliran hitam. Satu-satunya kasus ambigu adalah ketika semua pria di papan tulis dan ada 32 1 dan 32 0. Karenanya diperlukan bit ekstra untuk kasus ini saja. Karena tidak ada promosi sampai penangkapan terjadi, bit tambahan ini tidak mempengaruhi kasus terburuk secara keseluruhan (yang terjadi dengan 3 orang ditangkap dan 29 sisanya.)
Warna laki-laki yang menempati kotak
Kita tahu dari atas berapa banyak pria di sana. Ekstrak segitiga Pascal berikut menceritakan berapa banyak kemungkinan yang ada untuk distribusi hitam dan putih yang berbeda. Misalnya, untuk 3 pria, kemungkinannya adalah: 3 pria hitam (1 permutasi) 2 hitam, 1 putih, (3 permutasi), 1 hitam, 2 putih (3 permutasi), 3 putih (1 permutasi). Totalnya adalah 2 3 = 8. Secara umum, untuk jumlah pria yang lebih rendah ada 2 n kemungkinan. Namun semua kemungkinan hitam dan semua putih adalah ilegal (setidaknya raja dari masing-masing pihak harus di papan tulis) sehingga jumlah permutasi hukum yang sebenarnya adalah 2 n -2 (abaikan angka 1 pada segitiga Pascals.)
Untuk lebih dari 16 pria total, ada kendala tambahan yaitu tidak boleh ada lebih dari 16 pria dari setiap warna di papan tulis. Oleh karena itu ketika semua 32 pria di papan harus ada 16 dari masing-masing dan total kemungkinan jumlah adalah 601.080.390 yang cukup sedikit kurang dari 2 32 .
Jumlah kemungkinan dapat ditemukan dengan menjumlahkan "baris" dari ekstrak segitiga pascals ini (yang saya maksud adalah diagonal NE-SW dari tabel, karena saya memutar segitiga 45 derajat berlawanan arah jarum jam untuk presentasi yang nyaman. Jumlah bit yang dibutuhkan Oleh karena itu untuk menyandikan belokan, kuadrat yang ditempati dan warna pria adalah sebagai berikut:
Hingga 25 pria: sedikit kurang dari 64+ (jumlah pria)
Untuk lebih dari 25 pria:
Untuk dua warna, pria mana dan dalam urutan apa?
Seperti jawaban sebelumnya, tidak ada pion yang dapat dipromosikan sampai penangkapan terjadi, karena setiap pion diblokir oleh pion dengan warna yang berlawanan pada kolom yang sama. Jawaban Peter menganggap (sebagai batas atas) bahwa setiap tangkapan dapat menyebabkan satu promosi untuk pihak yang ditangkap dan dua untuk pihak yang ditangkap. Namun kami dapat membagi ini menjadi beberapa kasus:
Pion hitam menangkap pion putih: Sekarang pion yang menangkap bebas untuk dipromosikan karena ia sekarang berada di kolom yang berbeda. Rekannya di kolom yang sama juga bisa mempromosikan. Pion hitam di kolom asli pion putih juga bisa mempromosikan. Ini adalah satu-satunya kasus yang mengizinkan 3 promosi.
Pion hitam melewati pion putih di kolom yang berdekatan dan kemudian menangkap potongan putih (selain pion) di belakang. Ini memungkinkan pegadaian menangkap dan pion putih yang ada di kolom asli untuk mempromosikan. Satu promosi untuk setiap sisi.
Pion putih ditangkap oleh potongan (selain pion.) Ini biasanya memungkinkan satu promosi untuk Black saja. Satu-satunya pengecualian adalah ketika itu membebaskan formasi gadai yang diblokir yang sudah disebabkan oleh beberapa menangkap pion bergerak ke kolom yang sama.
Jadi, sebagai kasus dasar, kita dapat mempertimbangkan bahwa setiap tangkapan memungkinkan satu promosi masing-masing untuk kedua belah pihak. Dalam hal pria yang ditangkap adalah bidak, mungkin ada promosi tambahan untuk pihak yang menangkap.
Saya telah menulis sebuah program yang mirip dengan Peter. Ini agak kasar, tetapi memiliki tambahan penting: ia dapat menghitung jumlah permutasi yang mungkin ketika seorang pemain mulai dengan kurang dari 8 pion normal. Berikut adalah beberapa data yang dihasilkan oleh program:
Kita dapat melihat bahwa untuk kasus seperti 8 pion, 15 pria, 0 promosi, jumlah permutasi hanya sedikit kurang dari untuk 8 pion 16 pria, 0 promosi. Namun jika kita mempertimbangkan kasus seperti 7 pion, 15 pria, 0 promosi (yang sama dengan mempertimbangkan bahwa pria yang ditangkap jelas merupakan pion), kita mendapatkan sekitar setengah jumlah permutasi.
Jadi, Untuk kasus ketika Black memiliki 16 pria dan putih memiliki 15 pria, kita dapat mempertimbangkan perkiraan batas atas 2 promosi untuk Black dan satu promosi untuk White:
Namun kami dapat melakukan yang lebih baik jika kami melanjutkan sebagai berikut.
A. Pertimbangkan satu promosi masing-masing untuk Hitam dan Putih dengan asumsi bahwa pria Putih telah kehilangan bisa dari jenis apa pun:
B. Pertimbangkan kemungkinan tambahan untuk Black jika dia memiliki dua promosi, dikalikan hanya dengan kemungkinan untuk White di mana dia kehilangan pion.
Menambahkan dua ini bersama-sama kita dapatkan 2.25072E + 18, yang merupakan jumlah yang lebih kecil dari 3.55766E + 18. Semua kemungkinan hingga 3 tangkapan (29 orang tersisa) tercantum di bawah ini.
Jadi untuk kasus terburuk dari satu sisi dengan 15 pria dan yang lainnya dengan 14 pria, kita membutuhkan 67,804 bit.
Menambahkan ini ke 92,116 bit yang diperlukan untuk menentukan kotak dan warna mana, kami mendapatkan total 67,804 + 92,116 = 159,92 bit.
sumber
Kasus terburuk 177 bit
Algoritme ini, walaupun hampir tidak sederhana, memberikan 177 bit kasus terburuk (184b = 23B dalam praktiknya), 13b (16b = 2B) skenario kasus terbaik ketika hanya ada 2 raja yang tersisa.
sumber
sum_{i=0}^{15} sum_{j=0}^{15} 62! / (i! j! (62-i-j)!) < 2^87.45
.166 bit
1
bit: giliran siapa itu?2
bits: opsi castling mana yang terbuka? (NB saat membaca pertanyaan dengan saksama, Anda hanya perlu merekam opsi castling untuk pemain yang mendapat giliran).lg 6 ~= 2.585
bits: opsi en passant mana yang terbuka? (Lihat jawaban saya yang lain)lg sum_{i=1}^{16} sum_{j=1}^{16} 64! / (i! j! (64-i-j)! = lg 3629590441720924477681996172 ~= 91.552
bits: kotak mana yang ditempati oleh pria dengan warna apa?lg 451366131803622235200 ~= 68.613
menunjukkan pria mana dan urutannya (lihat di bawah)Menggunakan pengkodean aritmatika (karena pada setiap langkah kami menerapkan distribusi seragam) kami dapat mencapai
ceil(3 + 2.585 + 91.552 + 68.613) = 166
bit.Pengkodean untuk laki-laki: mengingat bahwa kita tahu berapa banyak laki-laki dengan warna tertentu, kita dapat dengan mudah menyebutkan semua kemungkinan distribusi / multiset pria (mis. Dengan 5 orang kita mungkin memiliki satu Raja, satu Ratu, dua Benteng, dan sebuah Pion) dan kemudian kita dapat mempertimbangkan semua permutasi yang mungkin dari setiap distribusi.
Namun, kami dapat melakukan lebih baik lagi dengan mempertimbangkan saling ketergantungan akun. Saya hanya melakukan ini pada tingkat yang sangat dasar: berapa banyak promosi yang memungkinkan? Gadai hanya bisa menjadi "berlalu" dan mampu mempromosikan dalam tiga cara: ia menangkap dan bergerak ke kolom yang berbeda; atau pion lawannya menangkap dan bergerak ke kolom yang berbeda; atau pion lawannya ditangkap. Dengan demikian penangkapan untuk putih berpotensi menciptakan dua bidak yang berlalu untuk putih dan satu untuk hitam.
Kami dapat membangun sebagian tabel batas atas pada promosi:
Kami juga dapat menghitung jumlah permutasi mengingat pemain memiliki pemain
N
dan tidak lebih dariP
pion yang dipromosikan:Menggabungkan keduanya, kita bisa mendapatkan jumlah bit yang diperlukan untuk menentukan kedua permutasi mengingat jumlah pria di kedua sisi:
Jika tidak ada di bagian tabel ini, kita dapat mengasumsikan bahwa kedua belah pihak memiliki hingga 8 promosi dan kami masih melakukan yang lebih baik daripada yang terburuk, yaitu 68,613 bit ketika satu memiliki 14 pria dan yang lain memiliki 15 pria.
Perhatikan bahwa ini masih jauh dari menjadi representasi yang sempurna, karena memungkinkan banyak posisi ilegal.
Kode untuk menghitung tabel permutasi:
sumber
<
daripada<=
di loop output dari program saya. Terima kasih telah menunjukkannya. Saya masih bisa memulihkan skor sebelumnya dengan casing khusus ke-32 pria yang ada di papan, tapi saya tidak akan melakukannya sekarang.178 bit (174 dalam keadaan darurat!) Kasus terburuk
Hai, baru saja kembali ke pengkodean, yang belum pernah saya lakukan sejak kuliah. Saya melihat situs ini dan berpikir ini terlihat menarik. Saya melakukan sedikit pemeriksaan teoritis dan tampaknya setidaknya 146 bit diperlukan untuk algoritma yang sempurna, mungkin beberapa lagi (saya akan menjelaskan dalam komentar ketika saya punya waktu.)
Bagaimanapun, ini adalah cara saya menyusun data. Konsep dasar datang pada 178 bit, tetapi dengan beberapa pokery jiggery dapat diturunkan ke 174 (itu 21 3/4 byte). 175 sedikit lebih mudah diprogram, lebih bisa dibaca oleh manusia, dan masih dalam 22 byte.
A) Posisi kedua raja: masing-masing 6 bit untuk putih dan hitam 12 BIT
B) Dari 62 kotak yang tersisa, yang ditempati? Matriks 62 BITS
C) Giliran siapa itu? 1 BIT
JUMLAH JAUH: 75 BIT
D) En Passant. Jika giliran putih untuk bergerak, hingga 5 pion hitam mungkin terlihat seperti bisa ditangkap En Passant. Gadai hitam harus berada di baris 5 (dari bawah ke atas mulai dari nol), dan memiliki gadai putih di sebelahnya. Satu situasi dengan jumlah tangkapan maksimum yang mungkin terlihat seperti ini:
BWBBWBBW
Jika ada 6 pion hitam di baris 5, putih hanya akan memiliki 2 kotak untuk berdiri dan hanya bisa mengancam 4 pion hitam, jadi tidak mungkin untuk memiliki lebih dari 5 pion hitam yang tampaknya di bawah ancaman dari orang yang lewat pada saat yang sama. Jadi kita memerlukan angka 1 hingga 5 yang menunjukkan pion mana (hingga 5) pada baris 5 yang memiliki pion yang bermusuhan (dalam hal ini putih) di sebelahnya adalah maju 2 kotak pada belokan terakhir ( atau, nol jika tidak ada bidak dalam situasi ini dipindahkan dengan cara ini pada belokan terakhir.)
E) Dari 30 kotak yang ditempati (tidak termasuk raja), apa isinya?
Ada 10 kemungkinan, masing-masing diwakili oleh angka desimal.
Bit paling signifikan mewakili warna.
Karenanya bilangan genap putih, angka ganjil hitam.
Putih hitam
Gadai 0/1 (atau Benteng yang diizinkan menuju kastil *)
Ksatria 2/3
Uskup 4/5
Benteng 6/7
Ratu 8/9
* Benteng yang diizinkan untuk dikastil (dan karena itu tidak pernah dipindahkan dari baris pertama atau terakhir) diwakili oleh 0 atau 1 bukannya 6 atau 7. Tidak dapat dikacaukan dengan pion, karena pion tidak dapat ditemukan pada baris pertama. atau baris terakhir.
Ini memberikan angka desimal hingga 30 digit, yang dapat kita kalikan dengan 6 dan kemudian menambahkan kode untuk En passant. Angka yang dihasilkan akan masuk ke dalam 103 bit, yang bila ditambahkan ke 75 yang disebutkan di atas adalah 103 + 75 = 178 bit . Sebenarnya, jika kita hanya mengalikan 10 daripada 6, tidak ada bedanya dengan jumlah bit yang digunakan, dan decoding lebih mudah.
Ini hanya 2 bit lebih dari 22 byte. Namun kita dapat menekannya ke 174 bit, seperti yang dijelaskan di bawah ini.
Jika tidak ada bagian yang ditangkap, maka gadai tidak mungkin dipromosikan .
Buktinya adalah sebagai berikut. Bayangkan putih terobsesi dengan mempromosikan pionnya pada (misalnya) kolom E, sejak awal permainan. Ada pion hitam di seberang pion ini yang menghalangi. Karena itu untuk mempromosikan pion ini, salah satu dari yang berikut harus terjadi:
1) Gadai hitam ditangkap.
2) Gadai hitam menangkap bagian lain dan karena itu bergerak keluar dari jalan.
3) pion putih menangkap pion pada kolom yang berdekatan seperti kolom D.
4) pion putih melewati (atau dilewati) pion hitam pada kolom yang berdekatan dan kemudian menangkap potongan pada kolom yang berdekatan yang sama, menyebabkan pion putih mengubah kolom.
Kasus 4 adalah yang paling menarik, karena bukan hanya pion putih yang dimulai pada kolom E yang sekarang memiliki jalur promosi yang jelas. Gadai hitam pada kolom yang tetap di kolom E juga dapat mempromosikan. Oleh karena itu satu tangkapan dapat membersihkan jalan bagi satu gadai dari setiap warna untuk dipromosikan.
Ngomong-ngomong, fakta bahwa tidak ada gadai yang bisa dipromosikan sampai karya diambil berarti kita tidak harus menyimpan karya ke-30. Kita dapat mengatasinya dengan eliminasi (atau dengan pengurangan, karena seperangkat kode bagian lengkap pada awal permainan selalu bertambah hingga jumlah yang sama = 80.) Satu poin kecil adalah bahwa kita harus memastikan bahwa kotak di mana rooks berdiri di awal permainan adalah di antara yang dipindai pertama (karena jika mereka terakhir, kita tidak akan tahu apakah benteng bisa benteng atau tidak.) Ini mudah dilakukan dengan memindai baris 0 dan kemudian baris 7 ke 1: Untuk r = 8 hingga 1 memindai baris [r mod 8].
Jadi, matriks bit dalam (B) akan memberi tahu kami berapa banyak potongan yang ada (tidak termasuk raja.) Jika ada 30 bit penuh, abaikan potongan terakhir saat pengkodean, decoder akan mencari tahu apa itu. Kami sekarang memiliki angka desimal hingga 29 digit, yang kami kalikan dengan 6 dan tambahkan ke kode Passant. Jumlah yang dihasilkan hanya akan diperas menjadi 99 bit, memberikan total 99 + 75 = 174 bit.
Sebagai contoh Inilah posisi aktual. Putih baru saja membuat langkah pertamanya (bidak raja maju) dan giliran Black`s.
A) Posisi raja (Putih / Hitam dalam oktal, 12 bit ): 03 73 = 000011 111011
B) Kotak mana yang ditempati? Mulailah dengan baris nol (baris bawah) kemudian semua baris lainnya dari atas ke bawah, lewati raja-raja:
C) Giliran Hitam: Putar Bit = 1
D) En Passant. Tidak ada pion putih di sebelah pion hitam, oleh karena itu tidak ada pion yang dapat diambil secara bersamaan (meskipun pion ini memang memajukan gerakan terakhir) jadi D = 0. Jika, alih-alih hanya mempertimbangkan pion yang memiliki pion yang bermusuhan di samping mereka, kami menganggap semua pion yang tidak memiliki bidak ramah di samping mereka di kedua sisi, maka D akan menjadi 1, karena ada satu bidak dalam situasi ini, dan ini khususnya pion itu memang tergerak pada belokan terakhir.
E) Sekali lagi, baris bawah pertama, lalu semua baris lainnya dari atas ke bawah, melompati raja-raja, dan dengan empat benteng yang belum diputar disebut sebagai 0 atau 1 (angka biasanya dicadangkan untuk pion.)
Digit ke-30 (dalam kurung) dapat dibuang.
Meskipun tidak terlalu jelas di sini, pion yang White telah maju sebenarnya ada di salah satu ujung daftar pion, karena kami memindai baris demi baris.
Data kami sekarang terlihat seperti ini, dengan 29 kode untuk isi kuadrat, ditambah kode En Passant:
Yang terbaik adalah memindai dari kanan ke kiri saat decoding dan dari kiri ke kanan (urutan terbalik) saat encoding. Ini berarti bahwa ketika ada potongan yang lebih sedikit kita akan memiliki jumlah yang lebih kecil, sambil mempertahankan konsistensi maksimum (yaitu kita ingin ruang kosong / nol menjadi yang terdepan, tidak tertinggal, untuk memungkinkan kompresi papan yang jarang ditempati.) Ketika kita hanya memiliki 2 raja di papan tulis, kita akan memiliki 75 bit yang disebutkan di atas, ditambah 3 bit untuk menyimpan data yang lewat = 78 bit dalam kasus terbaik. Setiap potongan tambahan datang sedikit di bawah 3,5 bit (2 buah dapat disimpan dalam 7 bit, karena 100 <128.)
Ada masalah praktis dalam bilangan bulat 99 bit yang terlalu besar untuk ditampung dalam variabel bilangan bulat 64 bit, yang berarti banyak bahasa pemrograman tidak memberikan dukungan untuk itu (Anda tidak bisa begitu saja mengubah representasi string dari 29-30 digit angka menjadi bilangan bulat.) Sebagai cara mudah pengkodean untuk 22 byte, kita dapat memecah angka 30 digit (29 kode potong + en kode passant) menjadi dua angka 15 digit yang masing-masing akan muat dalam 50 bit masing-masing (total 100 bit ditambah 75 yang disebutkan di atas membuat 175 bit kasus terburuk.)
Untuk kompresi maksimum, seperti yang dinyatakan di atas, 29 angka desimal ditambah kode En Passant (6 nilai yang mungkin), hanya akan masuk ke dalam 99 bit (dengan total 174 bit) tetapi tanpa dukungan dari bahasa untuk bilangan bulat ukuran ini adalah rumit untuk diprogram. Mungkin lebih mudah untuk memisahkan 29 bit warna dan bekerja dengan kode tipe piece (5 kemungkinan) dan kode Passant (6 kemungkinan) secara terpisah dari warna (70 bit, hampir cocok menjadi variabel 64 bit.)
sumber
Berikut ini adalah solusi lengkap, kasus terburuk aktual 181 bit
Fokus di sini adalah program sederhana yang dapat Anda pahami dengan mudah
Input adalah FEN, di sini adalah posisi pembukaan, memiliki enam bidang (5 & 6 diabaikan):
Bidang pertama (penempatan potongan) diuraikan
Untuk menghasilkan:
Field satu: mengkodekan lokasi raja (12 bit):
Bidang dua: menyandikan potongan (hingga 5 bit per potong):
Bidang tiga: warna aktif (1 bit)
Bidang empat: ketersediaan castling (4 bit)
Bidang lima: en passant (nol atau 3 bit)
Kasus terburuk naif 200 bit
QRRBBNN QQQQQQQQ
- 75 bitqrrbbnn qqqqqqqq
- 75 bitKasus terburuk aktual
Setiap pemain tidak dapat mempromosikan semua pion tanpa menangkap bagian lainnya . Berikut adalah efek entropi dari penangkapan potongan:
PpR
(3 + 3 + 5 = 11 bit) =>Qq_
(5 + 5 + 1 = 11 bit)PPpp
(3 + 3 + 3 + 3 = 12 bit) =>QQq_
(5 + 5 + 5 + 1 = 16 bit)Jadi sebenarnya papan kasus terburuk adalah:
QRRBBNN QQQQQQQQ
- 75 bitqrrbbnn qqqq
- 55 bitKasus terburuk adalah mempromosikan semua bagian daripada meninggalkan pion untuk orang yang lewat.
TOTAL KASUS TERBURUK AKTUAL DENGAN SHOWN KODE 12 + 75 + 55 + 34 + 1 + 4 = 181 bit
FIQ menunjukkan dua peningkatan pada skema sederhana ini, tetapi mereka lebih sulit untuk dikodekan:
Satu-satunya kode yang tersisa tidak ditampilkan dalam jawaban ini (untuk singkatnya) adalah: memecah input FEN di bidang (
split /\s/
) dan penugasan variabel.sumber
PPpp
=>QQq_
Total data membutuhkan 33 byte
(Terima kasih kepada seseorang di komentar saya menyadari ini tidak berfungsi untuk promosi gadai. Akan memperbarui ini ketika saya bisa menyelesaikannya)
untuk byte pertama kita menggunakan lima bit:
32 byte berikutnya digunakan untuk mewakili setiap bagian catur, dalam urutan yang telah ditentukan
lain menunjukkan apakah ia telah ditangkap. 0 = tidak ditangkap
(Jika bisa en-passant maka pasti tidak ditangkap)
Beberapa kode C untuk mewakili ide ini (yang sebenarnya tidak berfungsi)
sumber
256242 bitBerikut adalah algoritma kompresi dasar yang mungkin dapat ditingkatkan karena tidak mengecualikan posisi ilegal tertentu dari yang diwakili.
Papan dimulai dengan 5 bit informasi header, sebagai berikut:
Kemudian, string 12 bit mewakili posisi raja.
Kemudian, angka 64-digit yang sangat besar pada basis 11, yang kemudian dikalikan dengan 9 untuk menambahkan digit lain pada bagian akhir yang mewakili keadaan en-passant. Setiap digit pada basis 11 mewakili sebuah persegi di papan tulis, dengan nilai-nilai berikut yang mungkin:
Dan digit pada basis 9:
11 64 × 9 adalah sekitar 2 224.57 , yang membutuhkan 225 bit untuk dikodekan. Ditambah 17 bit tajuk di bagian atas, adalah total 242 bit.
Terima kasih ugoren untuk perbaikannya.
sumber
13^64 * 9
adalah 239,99, menghemat 11 bit. Simpan lebih banyak dengan mengode posisi raja secara terpisah.? bit
(≥ 217 terburuk, 17 terbaik, 179 untuk papan awal)
Deskripsi pengodean
Metadata tambahan terdiri dari giliran siapa (satu bit) dan castling (empat bit, yaitu kastil putih di sisi raja 'di sisi ratu' dan juga untuk hitam).
Untuk posisi papan itu sendiri, kami menyandikannya sebagai satu set potongan aktif. Sebenarnya, kami memastikan untuk menghitung satu per satu bagian dengan urutan tertentu untuk alasan yang akan saya jelaskan sedikit. Untuk setiap bagian kami menyimpan warnanya (satu bit), jenisnya (tiga bit untuk mencakup 6 jenis, ditambah satu jenis tambahan untuk "pion yang dapat diambil oleh en passant"), serta posisinya.
Inilah bagian yang menarik: untuk menyandikan posisi potongan, alih-alih menyimpannya sebagai koordinat, kami menyimpan jarak relatifnya dari potongan terakhir ketika menghitung bagian-bagian dalam urutan kiri-ke-kanan, atas-ke-bawah (yaitu A8 , B8, ..., G1, H1). Selain itu, kami menyimpan jarak sebagai angka panjang variabel, menggunakan
1
berarti bahwa bagian ini tepat di sebelah sebelumnya,0xx
untuk melewatkan 1-3 buah,000xxx
untuk melewatkan 4-10 buah,000000xxxx
untuk 11-25,0000000000xxxxx
untuk 26-56 dan akhirnya000000000000000xxx
untuk 57-62.Contohnya
Saya membuat intisari dari beberapa posisi yang dikodekan dengan pengkodean ini, dan menjelaskannya untuk posisi awal dengan beberapa komentar.
Saya tidak tahu bagaimana menganalisis ukuran bit terburuk, tetapi dengan contoh-contoh di intinya, saya percaya bahwa algoritme setidaknya harus agak efisien.
Implementasi decoder
Di bawah ini adalah dekoder cepat dan kotor untuk pengkodean ini (mengambil sebagai input data biner yang dikodekan dalam teks, seperti dalam contoh beranotasi di atas, dan melompati hal-hal yang bukan '0' atau '1'). Menghasilkan papan catur unicode ke stdout.
sumber
Maks: 184 bit, Min: 75 bit
Saya terinspirasi oleh kode Huffman dari @SammSpeight untuk mencoba membuat skema sendiri. Saya ragu ini akan menang, tetapi memang memiliki batas yang dapat dihitung.
Skema ini memperlakukan bidak catur seolah-olah ada 11 jenis bidak yang berbeda. Saya kira-kira mengikuti algoritma pengkodean Huffman untuk mengelompokkan kelas-kelas ini berdasarkan frekuensi dan tipe nyata untuk menghasilkan pengkodean berikut:
Kode masing-masing bagian dapat didahului oleh dua bit untuk menunjukkan ke tim mana ia berada (
10
untuk Putih,11
untuk Hitam).0
dapat digunakan untuk menyandikan ruang kosong. Ide-ide ini memungkinkan kita untuk membangun encoding persegi-demi-persegi untuk seluruh papan menggunakan prosedur apa pun yang kita inginkan. Saya akan menganggap urutan iterasia1, b1, c1, ... f8, g8, h8
. Ini berarti bahwa hanya daftar kode-kode ini seperti yang ditunjukkan di atas mengkodekan semua informasi kecuali giliran siapa. Mesin catur yang sangat sederhana dapat menggunakan "kelas" untuk bidak, benteng, dan raja untuk menentukan apakah castling dan en passant adalah legal. Selain itu, skema ini dengan mudah menangani promosi gadai. Jika seorang pemain mempromosikan pion ke benteng, baik kode raja atau sisi ratu dapat digunakan selama varian "dipindahkan" dipilih.Kecuali posisi patologis yang saya pikir tidak akan pernah bisa terjadi, skenario terburuk untuk pengkodean ini adalah ketika semua bagian masih ada di papan dan pemain sebelumnya memindahkan pion ke depan dua ruang. Sebagai contoh, papan di bawah ini menyandikan
1. e4
:Ini berarti bahwa pengkodean terburuk memiliki 184 bit: 1 untuk menunjukkan pemain, 32 untuk ruang kosong, 45 untuk pion yang tidak bergerak, 6 untuk pion melompat dua ruang, 24 untuk para ksatria, 24 untuk para uskup, 28 untuk para benteng, 12 untuk para ratu, dan 12 untuk para raja.
Saat potongan bergerak dan ditangkap, ukuran pengkodean akan turun. Skenario kasus terbaik diwakili oleh dua raja saja di papan: 1 bit untuk menunjukkan pemain + 62 bit untuk menunjukkan kotak kosong + 12 bit untuk menunjukkan raja memberikan panjang minimum 75 bit.
Saya akan kembali dan mengedit respons ini dengan beberapa kode yang menunjukkan tindakan encoding ini hari ini atau besok. Untuk saat ini, saya ingin tahu apa pendapat orang lain tentang pengkodean ini.
sumber
11001
sarana penandaB'S MOVE
W CAN KSC
W CANT QSC
B CANT KSC
B CAN QSC
). Itu adalah 4 bit, bukan 5 bit per sisi dalam pengkodean Anda, atau 3 bit per sisi jika Anda menghilangkan penanda sisi pada benteng. (KSC
= Kastil sisi-QSC
raja . = Kastil sisi-ratu)184 bit = 23 byte kasus terburuk, dan tidak terlalu rumit:
A. Kotak mana yang ditempati: 64 bit = 8 byte B. Yang warna untuk <= 32 kotak yang ditempati: 32 bit = 4 byte Dan sekarang hanya menggunakan <= 30 kotak yang ditempati oleh bukan raja: B. gunakan PNBRQ yang disandikan dalam radix 5, untuk 5 ^ 30 kemungkinan; dan 32 * 31 * 2 * 4 * 4 * 9 untuk posisi raja, warna penggerak, hak castling putih & hitam, en passant square (di antara 8 kemungkinan plus tidak ada, ke-9); angka ini 5 ^ 30 * 32 * 31 * 2 * 4 * 4 * 9 = 266075134277343750000000000 = 2 ^ 87,782 cocok dalam 88 bit untuk total 64 + 32 + 88 = 184 bit untuk seluruh pengkodean.
Ini dapat dikurangi, mis. 32 * 31 * 2 * 4 * 4 * 9 = 285696 dapat dikurangi menjadi 2 * (32 * 31 + 31 * 3 + 31 * 3 + 3 * 3) * 6 = 14244, dengan menggunakan fakta paling banyak 6 kandidat korban yang lewat (termasuk tidak ada), dan mengkodekan hak-hak pemeran dan posisi raja dalam set yang sama menggunakan hak-hak pemerasan fakta hanya penting ketika raja di lapangan awal. Ini menghemat 4 bit.
Saya punya alasan untuk percaya bahwa tidak mungkin mencapai 18 byte, yaitu jumlah total posisi catur legal melebihi 2 ^ 144.
Skema 160-bit Anda sangat cerdik tetapi saya pikir ini perlu diberikan sebagai program encode / decode sebelum saya benar-benar yakin tentang hal itu.
sumber
171 bit kasus terburuk:
Saya telah menggabungkan beberapa ide, dan juga beberapa pemikiran saya sendiri.
Kita akan mulai dengan papan 64 bit. Setiap bit mewakili ruang yang ditempati di papan tulis. Mereka mengisi baris. Jadi awalnya terlihat seperti:
1111 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111
Sekarang, masing-masing bagian akan diwakili oleh 4 bit. Bit 1: warna (
0=white, 1=black
) Bit 2-4: Satu dari 8 jenis.Pada akhirnya kami akan menyertakan sedikit menunjuk gilirannya.
0=white, 1=black
.4bits * 32 pieces = 128 bit dan saya sudah mendapatkan 64 +1 dari turn and board. Itu menghasilkan total 128 + 64 + 1 = 193 Saya bahkan belum mulai dengan en passant atau castling. Lebih dari batas saya dengan apa-apa - bahkan tidak berubah. Di sinilah trik dimulai.
Oke - Anda melihat tipe di atas? Bishop0 dan Bishop1? Pion0 dan pion1? Jenis-jenis itu sangat ditentukan, karena mereka memberi tahu kami sedikit untuk memasukkan setelah bagian ini. Jadi Bishop0 berarti bahwa setelah itu, akan ada 0 - yaitu bahwa potongan berikutnya berwarna putih. Bishop1 memberi tahu kita bagian selanjutnya berwarna hitam, dan pion0 dan pion1 bekerja sama. (Jika bagian ini adalah bagian terakhir yang disebutkan, maka itu memberi tahu kita tentang giliran berikutnya).
Kasus terburuk saya melibatkan semua bagian di papan tulis, jadi dengan 16 pion dan 4 uskup, ini menghemat 20 bit. Saya turun ke 173.
Baik. Untuk bit lain dalam kasus terburuk saya - setelah ada 16 warna yang dikodekan, kami berhenti mengkodekan warna - seperti yang kita tahu akan maju. Kasus terburuk saya sekarang melibatkan sepotong putih membuatnya ke sudut jauh tanpa tangkapan. Di sana, saya hanya menyimpan sedikit. 172.
Sekarang saya akan mengubah urutan yang saya beri nama. Kami akan menamai mereka di sepanjang kolom mulai dari luar bergerak masuk. Papan bernama di awal akan tetap sama, tetapi ketika saya menempatkan potongan di atasnya, saya mulai dari kanan bawah putih, dan naik kolom itu. Lalu aku melompat ke kanan bawah hitam, dan naik ke kolom itu. Saya melompat ke sel putih yang tidak diketahui kanan bawah, dan sebagainya - ini berarti kasus terburuk saya adalah awal lagi. Alasan saya ada hubungannya dengan trik en passant saya, dua bit berikutnya yang saya hilangkan, dan kasting.
Sekarang, untuk gadai yang akan dipromosikan (seperti yang telah dibahas panjang lebar) sepotong harus ditangkap. Jadi, ketika kita tahu ada 32 buah, kita hanya perlu menunjukkan 31 dari mereka. Bagian terakhir diidentifikasi secara unik. Ternyata, bagi saya, ini hanya menghemat 2 bit - karena bagian terakhir saya mungkin pion / uskup (yang biasanya harganya 3 bit karena saya menyimpannya satu pada bagian berikutnya) yang warnanya sudah ditentukan dan jadi hanya 2 bit. Saya turun ke 170 bit.
Ketika pion dipromosikan, mereka hanya mengubah tipenya. Untuk setiap bagian yang keluar dari papan saya membebaskan diri dari (minimum) 3 bit, dan dua promosi gadai harganya 2 bit, jadi saya menolak (perlahan) dalam promosi.
Castling. Agar kastil terjadi, raja atau benteng yang relevan mungkin tidak bergerak. Dengan demikian, ketika sebuah benteng mampu melemparkan keduanya dan raja akan berada di tempat asalnya. Jadi, benteng yang mampu melakukan castling akan terdaftar di tempat yang sama dengan raja-raja dengan warna itu. Karena ini ilegal (dua raja atau tiga raja dengan warna yang sama di papan tulis) dan hanya dapat terjadi dalam tiga pengaturan yang memungkinkan untuk setiap warna (kiri, kanan, kedua benteng didaftar sebagai raja) - penguraian sandi sangat mungkin dilakukan. Jadi, tanpa bit kita telah mengkodekan castling.
En Passant Di sini kami juga akan menggunakan posisi ilegal. Hanya satu bidak yang bisa berada dalam bahaya saat lewat. Itu harus di baris keempat. Gadai yang rentan akan 'dibalik' kembali ke barisan rumahnya - diganti dengan apa pun yang ada di sana. Karena pion itu berada di baris pertama - posisi ilegal, situasinya akan jelas bagi decoder - itu akan membalik posisi, dan menandai pion sebagai rentan terhadap pelintas.
Kami perlu bercampur dengan pesanan karena bagian terakhir harus 'diidentifikasi secara unik'. Dalam urutan standar, kita tidak akan bisa tahu apakah benteng di sudut belakang bisa kastil - itu tidak diketahui. Ketika kami bekerja dari luar ke dalam, kami menjamin bahwa di mana pun benteng itu 'terdaftar' baik itu di sudutnya sendiri, atau di tengah papan karena diganti dengan pion rentan yang lalu lalang, akan ada bagian yang terdaftar setelah itu - jadi kita diberitahu tipe benteng. Kita tahu akan ada bagian setelahnya karena, agar gadai menjadi rentan harus ada gadai di dalamnya (yang akan dikodekan nanti sesuai dengan instruksi di atas).
Oh, dan untuk memastikan bahwa kasus terburuk melibatkan semua bagian di papan tulis, setelah kita memiliki kurang dari 32 bagian, kita dapat menggunakan papan 64 bit untuk mengidentifikasi posisi serta posisi yang ditempati dengan menggunakan 0 untuk mewakili bagian ketika bagian putihnya berbalik dan 1 ketika giliran orang kulit hitam.
Jadi kami bebas dan kastil secara gratis. Kami mengambil bagian terakhir secara gratis, meskipun butuh beberapa finagling untuk membuatnya bermain bagus dengan aturan en passant dan castling. Kami membuang 20 bit pada potongan standar. Saya percaya kasus terburuk di sini melibatkan pion putih tengah bergerak maju dan sepotong hitam di antara itu dan ratu sementara semua bagian ada di papan tulis. Periksa cepat: bagian pertama ditangkap - sebut saja pion, 3 bit dari papan di pion, 3 bit di papan dalam bentuk bagian terakhir, satu bit di penanda belok menghilang. Promosikan dua bidak 2 bit kembali di papan tulis. Ah sial, aku di 171.
EDIT Saya telah menambahkan kode untuk decoder (berfungsi?) - di R - di bawah. Dibutuhkan vektor booleans sebagai input - (maaf - saya tidak mampu mengkode dengan baik dalam hal apa pun yang akan membuat saya benar-benar menggunakan bit) Saya juga sudah memasukkan posisi awal.
Kode ini membangun 4 fungsi. Salah satu yang melakukan pemisahan dasar dari potongan-potongan dan struktur papan, serta mencari tahu jenis potongan dan setiap potongan 'implisit'. Fungsi selanjutnya mengisi struktur papan dengan potongan-potongan dalam urutan yang sedikit aneh (dan berbeda dari algoritma awal saya) [dijelaskan dalam komentar kode]. Fungsi selanjutnya mengambil papan yang terisi dan mendeteksi posisi ilegal - kemudian memperbaikinya dan mengganti nama pion yang rentan terhadap en passant "x pawn-e" dan setiap benteng yang dapat benteng "x rook-c". Fungsi terakhir adalah pembungkus yang menjalankan fungsi-fungsi tersebut secara berurutan dan memberikan output yang merupakan papan saat ini serta gilirannya.
Saya juga menyertakan penyandian posisi awal (meskipun untuk melihatnya Anda harus memanggil
c(startboard,newpieces)
dan kode memanggil fungsi wrapper pada posisi itu.sumber
229/226 bit
Ini ternyata tidak terlalu berhasil, tetapi mungkin menyelamatkan orang lain melalui jalan yang sama.
Versi sederhana:
1
bit untuk giliran siapa4
bit untuk empat kemungkinan casting3
bit untuk en passant kemungkinan. Ini memiliki kedalaman yang saya mengerti pada awalnya. En passant harus dilakukan oleh pion yang bergerak dari pangkat (baris) yang sama dengan pion yang ditangkap. Analisis kasus menunjukkan bahwa setelah kita tahu berapa banyak bidak warna yang terakhir pindah telah maju tepat dua kotak, akan ada paling banyak 6 en passant kasus (termasuk kasus yang tidak ada pion rentan terhadap sambil lalu ). Kasus terburuknya adalah 5 pion (berpotensi semua rentan: misalnyaPpPPpPPp
memiliki lima rentanP
). Dengan 6 pion ada paling banyak 2 pion musuh di peringkat yang sama, yang masing-masing bisa mengancam paling banyak 2 pion dalam perjalanan . Karena itu kita perluceil(lg 6) = 3
bit di sini.Lalu papan tulis. Papan memiliki 64 kotak, sehingga indeks kuadrat dapat dikodekan dalam 6 bit. Kami membuat daftar para lelaki berdasarkan pangkat, bergantian warna, mulai dari raja.
6
bit: posisi raja putih. (Dijamin akan berada di papan tulis).6
bit: posisi raja hitam. (Dijamin berada di papan tulis. Dalam kasus terburuk bahwa raja kulit putih ada di sudut, ada 60 tempat yang mungkin dia bisa; dalam kasus terbaik bahwa putih tidak berada di tepi, ada 55).6
bit: posisi ratu putih. Jika tidak ada ratu putih, ulangi posisi raja putih sebagai sinyal.1
sedikit diikuti oleh 6 bit untuk posisi.0
sedikit.0
bit terakhir .Ini menghabiskan
12
sedikit demi sedikit untuk raja-raja, dan2*7*5-1 = 69
sedikit untuk yang lain. Dalam kasus terburuk bahwa semua 32 pria di papan tulis, itu biaya7
bit untuk setiap orang selain raja, untuk total12 + 7*30 - 1 = 221 bits
. Jadi dengan8
bit awal untuk kondisi global kita memiliki 229 bit .Versi lanjutan:
Dengan menggunakan pengkodean aritmatika kita dapat beroperasi dengan
lg num_possibilities
daripadaceil(lg num_possibilities)
dan hanya mengambil satuceil
di akhir.1
bit untuk giliran siapa4
bit untuk empat kemungkinan castinglg 6
bit untuk en passant kemungkinan.6
bit untuk raja putihlg 60
bit (kasus terburuk) untuk raja hitamlg 63
bit (karena saya tidak ingin mempersulit ke tingkat melihat cek) untuk ratu putih, menggunakan posisi raja putih jika tidak ada1
bit diikuti olehlg 62
,lg 61
, dll bit untuk posisinya.0
sedikit.lg 63
bit (atau lebih sedikit, jika ada ratu putih) untuk ratu hitam.Orang ketiga yang benar-benar hadir memiliki
66-n
nilai-nilai yang memungkinkan. Jika suatu jenis tidak ada untuk warna, kami menghabiskan66-#men so far
bit dalam merekam itu (ditambah satu bit untuk pemisah). Kasus ekstrim adalah:5+lg 6
untuk negara global,6+lg 60
raja,29
bit pemisah, danSUM_{n=32}^{63} lg n
bit pada posisi. Total keseluruhan:ceil(225.82)
bit. Mengecewakan.5+lg 6
untuk negara global,6+lg 60
raja,29
bit pemisah,8*lg 63
mengatakan bahwa tidak ada bagian lain, danSUM_{n=48}^{63} lg n
pada posisi pion. Total keseluruhan:ceil(188.94)
bit. Lebih baik - dengan menyelamatkan benteng kedua, ksatria, dan uskup untuk setiap sisi kita telah sedikit maju.Jadi kasus terburuk sepertinya adalah 226 bit , untuk penghematan yang sangat kecil 3.
Kami pasti bisa melakukan yang lebih baik dalam kasus rata-rata dengan menyandikan pion sebelum bagian, karena terbatas pada 48 kotak daripada 64 penuh. Namun, dalam kasus terburuk bahwa semua pria ada di papan tulis dan semua pion telah dipromosikan, saya pikir ini akan berakhir dengan biaya 2 bit lebih karena kita akan memerlukan bendera "tidak ada pion" daripada bisa menghitung laki-laki.
sumber
Ini adalah topik diskusi di kalangan Catur.
Berikut adalah satu bukti yang sangat sederhana dengan 164 bit https://groups.google.com/forum/#!topic/rec.games.chess.computer/vmvI0ePH2kI 155 ditampilkan di sini http://homepages.cwi.nl/~tromp /chess/chess.html
Lebih dari strategi yang disederhanakan:
sumber
Min: 0 bit
Maks:
1734243 bit (4.3354,401 bit / papan diamortisasi)Diharapkan:
351177 bit (4.3764.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:
Akan dikodekan sebagai:
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.
sumber