Tối thiểu: 0 bit
Tối đa: 1734 243 bit (4.335 4.401 bit / bảng được khấu hao)
Kỳ vọng: 351 177 bit (4.376 4.430 bit / bảng được khấu hao)
Vì tôi có thể xác định đầu vào và đầu ra tuy nhiên tôi muốn, tôi quyết định đi theo mã hóa lịch sử của trò chơi cho đến thời điểm này. Một lợi thế là thông tin bổ sung về người đến lượt, người thông qua và người có khả năng xây lâu đài nơi có thể bắt nguồn và không được mã hóa.
Nỗ lực 1:
Tôi nghĩ rằng tôi có thể mã hóa mỗi lần di chuyển trong 12 bit, 4 bộ ba có dạng (bắt đầu x, bắt đầu y, kết thúc x, kết thúc y) trong đó mỗi lần là 3 bit.
Chúng tôi sẽ đảm nhận vị trí bắt đầu và di chuyển các mảnh từ đó với màu trắng đi trước. Bảng được sắp xếp sao cho (0, 0) là góc dưới bên trái màu trắng.
Ví dụ: trò chơi:
e4 e5
Nf3 f6
Nxe5 fxe5
... ...
Sẽ được mã hóa thành:
100001 100010 100110 100100
110000 101010 101110 101101
101010 100100 101101 100100
...
Điều này dẫn đến mã hóa 12 m bit trong đó m là số lần di chuyển được thực hiện
Một mặt điều này có thể trở nên rất lớn, mặt khác bạn có thể coi mỗi nước đi là trò chơi riêng của mình để mỗi mã hóa thực sự mã hóa m "bàn cờ". Nếu bạn khấu hao khoản này, bạn nhận được rằng mỗi "bàn cờ" là 12 bit. Nhưng tôi cảm thấy điều này là một chút gian lận ...
Cố gắng 2:
Tôi nhận ra rằng mỗi động thái trong lần thử trước đều mã hóa nhiều động thái bất hợp pháp. Vì vậy, tôi quyết định chỉ mã hóa các động thái hợp pháp. Chúng tôi liệt kê các chuyển động có thể như sau, đánh số từng ô vuông sao cho (0, 0) → 0, (1, 0) → 1, (x, y) → x + 8 y. Lặp lại qua các ô và kiểm tra nếu một mảnh ở đó và nếu nó có thể di chuyển. Nếu vậy, thêm các vị trí nó có thể đi đến một danh sách. Chọn chỉ mục danh sách đó là động thái bạn muốn thực hiện. Thêm số đó vào tổng số lần di chuyển có trọng số bằng 1 cộng với số lần di chuyển có thể.
Ví dụ như trên: Từ vị trí bắt đầu, mảnh đầu tiên có thể di chuyển là hiệp sĩ trên ô vuông 1, nó có thể di chuyển đến ô vuông 16 hoặc 18, vì vậy hãy thêm chúng vào danh sách [(1,16),(1,18)]
. Tiếp theo là hiệp sĩ trên ô vuông 6, thêm di chuyển của nó. Nhìn chung, chúng tôi nhận được:
[(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)]
Vì chúng tôi muốn di chuyển (12, 28), chúng tôi mã hóa số này thành 13 trong cơ sở 20 vì có 20 di chuyển có thể.
Vì vậy, bây giờ chúng tôi nhận được số trò chơi g 0
= 13
Tiếp theo, chúng tôi làm tương tự cho màu đen ngoại trừ chúng tôi đánh số các ô ngược lại (để dễ dàng hơn, không bắt buộc) để có được danh sách di chuyển:
[(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)]
Vì chúng tôi muốn di chuyển (11, 27), chúng tôi mã hóa số này thành 11 trong cơ sở 20 vì có 20 di chuyển có thể.
Vì vậy, bây giờ chúng tôi nhận được số trò chơi g 1
= (11 20) + 13 = 233
Tiếp theo, chúng tôi nhận được danh sách các động thái sau đây cho màu trắng:
[(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)]
Vì chúng tôi muốn di chuyển (6, 21), chúng tôi mã hóa số này thành 13 trong cơ sở 29 vì có 29 di chuyển có thể.
Vì vậy, bây giờ chúng tôi nhận được số trò chơi g 2
= ((13 ⋅ 20) + 11) 20 + 13 = 5433
Tiếp theo, chúng tôi nhận được danh sách các động thái sau đây cho màu đen:
[(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)]
Vì chúng tôi muốn di chuyển $ (10, 18) $ (10, 18)
Vì vậy, bây giờ chúng tôi nhận được số trò chơi g 3
= (((19 ⋅ 29 + 13) 20) + 11) 20 + 13 = 225833
Và tiếp tục quá trình này cho tất cả các động thái còn lại. Bạn có thể nghĩ g là hàm g (x, y, z) = x y + z. Do đó 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)
Để giải mã số trò chơi g 0 , chúng tôi bắt đầu ở vị trí ban đầu và liệt kê tất cả các di chuyển có thể. Sau đó, chúng tôi tính g 1 = g 0 // l , m 0 = g 0 % l , trong đó l là số lần di chuyển có thể, '//' là toán tử chia số nguyên và '%' là toán tử mô đun. Cần giữ g 0 = g 1 + m 0 . Tiếp theo chúng ta thực hiện di chuyển m 0 và lặp lại.
Từ ví dụ trên nếu g 0 = 225833 thì g 1 = 225833 // 20 = 11291 và m 0 = 225833% 20 = 13. Tiếp theo g 2 = 11291 // 20 = 564 và m 1 = 11291% 20 = 11. Sau đó g 3 = 11291 // 20 = 564 và m 2 = 11291% 20 = 11. Do đó g 4 = 564 // 29 = 19 và_m_ 3 = 564% 29 = 13. Cuối cùng g 5 = 19 // 29 = 0 và m 4 = 19% 29 = 19.
Vậy có bao nhiêu bit được sử dụng để mã hóa một trò chơi theo cách này?
Để đơn giản, giả sử luôn có 20 lần di chuyển mỗi lượt và trong trường hợp xấu nhất, chúng tôi luôn chọn người lớn nhất, 19. Số chúng tôi sẽ nhận được là 19 20 m
+ 19 20 m - 1
+ 19 20 m - 2
+ ⋯ + 19 ⋅ 20 + 19 = 20 m + 1
- 1 trong đó _m là số lần di chuyển. Để mã hóa 20 m + 1
- 1, chúng ta cần khoảng
các bit log 2
(20 m + 1 ) khoảng (m + 1) ∗ log 2
(20) = 4.3219 ∗ (m + 1)
Trung bình m = 80 (40 di chuyển cho mỗi người chơi), do đó, sẽ mất 351 bit để mã hóa. Nếu chúng tôi ghi lại nhiều trò chơi, chúng tôi sẽ cần mã hóa toàn cầu vì chúng tôi không biết mỗi số sẽ cần bao nhiêu bit
Trường hợp xấu nhất khi m = 400 (200 di chuyển cho mỗi người chơi) vì vậy điều này sẽ mất 1734 bit để mã hóa.
Lưu ý rằng vị trí chúng tôi muốn mã hóa phải được trao cho chúng tôi thông qua con đường ngắn nhất để đến đó bằng cách tuân theo các quy tắc. Ví dụ, trò chơi được lý thuyết hóa ở đây không cần m = 11741 để mã hóa vị trí cuối cùng. Thay vào đó, chúng tôi chạy tìm kiếm Breadth-First để tìm đường đi ngắn nhất đến vị trí đó và mã hóa thay vào đó. Tôi không biết chúng ta sẽ cần phải đi sâu đến mức nào để liệt kê tất cả các vị trí cờ vua, nhưng tôi nghi ngờ rằng 400 là một sự đánh giá quá cao.
Tính toán nhanh:
Có 12 quân cờ độc đáo hoặc hình vuông có thể để trống để đặt chúng trên bàn cờ là 13 64 . Đây là một sự đánh giá quá cao vì nó bao gồm nhiều vị trí không hợp lệ. Khi chúng ta m di chuyển vào các trò chơi chúng tôi đã tạo ra khoảng 20 m vị trí. Vì vậy, chúng tôi đang tìm kiếm khi 20 m = 13 64 . Đăng nhập cả hai mặt để có được m = 64 * log 20 (13) = 54.797. Điều này cho thấy chúng ta sẽ có thể đến bất kỳ vị trí nào trong 55 lần di chuyển.
Bây giờ tôi đã tính trường hợp xấu nhất là m = 55 chứ không phải m = 400, tôi sẽ chỉnh sửa kết quả của mình. Để mã hóa một vị trí trong đó m = 55 mất 243 bit. Tôi cũng sẽ nói rằng trường hợp trung bình là khoảng m = 40, cần 177 bit để mã hóa.
Nếu chúng ta sử dụng đối số khấu hao từ trước đó, chúng ta sẽ mã hóa 400 "bàn cờ" trong 1734 bit để chúng ta nhận được rằng mỗi "bàn cờ" chiếm 4.335 bit trong trường hợp xấu nhất.
Lưu ý rằng g = 0 biểu thị một trò chơi hợp lệ, trò chơi mà mảnh trên hình vuông thấp nhất di chuyển đến hình vuông thấp nhất có thể.
Ghi chú bổ sung:
Nếu bạn muốn tham khảo một vị trí cụ thể trong trò chơi, bạn có thể cần phải mã hóa chỉ mục. Điều này có thể được thêm bằng tay, ví dụ như ghép chỉ mục vào trò chơi hoặc thêm một động thái "kết thúc" bổ sung như là lần di chuyển cuối cùng có thể mỗi lượt. Điều này hiện có thể giải thích cho các cầu thủ bị thủng lưới, hoặc 2 liên tiếp để biểu thị các cầu thủ đã đồng ý rút thăm. Điều này chỉ cần thiết nếu trò chơi không kết thúc trong một checkmate hoặc bế tắc dựa trên vị trí, trong trường hợp này nó được ngụ ý. Trong trường hợp này, nó mang số bit cần thiết trung bình lên tới 356 và trong trường hợp xấu nhất là 1762.