Vì bạn đang nói về lập trình, có lẽ bạn đang tìm kiếm một sơ đồ lưu trữ nhỏ gọn hơn trong không gian bộ nhớ máy tính so với FEN. Bên cạnh việc ra ngoài để nghiên cứu cách nó được thực hiện trong các bàn lớn, hai khả năng xuất hiện trong tâm trí tôi ngay lập tức.
FEN bình thường
Vì lợi ích của cuộc thảo luận này, FEN "bình thường" chỉ là một chuỗi văn bản điển hình được biểu thị bằng các ký tự 1 byte (8 bit). Hãy xem xét một trường hợp xấu nhất được đơn giản hóa :
r1b1k1n1/1p1p1p1p/p1p1p1p1/1n1q1b1r/R1B1P1N1/1P1P1P1P/P1P1K1P1/1N1Q1B1R w KQkq e3 999 999
Tất nhiên đây không phải là một FEN hợp lệ, nhưng nó là giới hạn trên hiệu quả đối với sự phức tạp của chúng ta. Có tám ký tự cho mỗi cấp bậc, cộng với bảy dấu gạch chéo, năm dấu cách và mười ba ký tự bổ sung tạo thành các trường còn lại. Đó là 89 ký tự, với tổng kích thước 712 bit .
FEN nén
Phiên bản này chỉ lấy một đại diện FEN và sử dụng một số quan sát cơ bản để giảm số lượng bit cần thiết để lưu trữ nó. Dưới đây là những quan sát của chúng tôi:
- Các dấu gạch chéo là không cần thiết để lưu trữ máy; mỗi cấp bậc chỉ đơn giản là "thêm vào 8". Vì vậy, chúng tôi có thể loại bỏ dấu gạch chéo trong đại diện nội bộ của chúng tôi.
- Các ký tự có thể còn lại (trong phần đầu tiên) là :
kK qQ rR bB nN pP 12345678
. Sự khác biệt giữa 20 ký tự khớp với năm bit, vì vậy trong trường hợp xấu nhất được đơn giản hóa của chúng tôi, chúng tôi có năm bit lần tám tệp, tám lần xếp hạng là 320 bit cho phần đầu tiên.
- Chúng tôi không cần bất kỳ không gian nào; một lần nữa chúng là một tiện lợi cho con người. Điều đó giúp chúng tôi tiết kiệm năm nhân vật.
- "Ai có động thái" là một bit: Trắng hoặc Đen.
- Castling có sẵn là bốn bit: có sẵn / không có sẵn cho mỗi
KQkq
.
- En passant thường không có sẵn và nó có thể chiếm rất nhiều không gian (sáu bit để đại diện cho tất cả các hình vuông), vì vậy hãy di chuyển nó đến cuối và làm cho nó tùy chọn: nếu có các bit passant , nó có sẵn, nhưng nếu nó không có sẵn chỉ cần chấm dứt biểu diễn sau các bit di chuyển và nửa di chuyển để tiết kiệm không gian.
- Để đơn giản, tôi chỉ phân bổ mười bit cho mỗi bộ đếm di chuyển và nửa di chuyển. Điều này có nghĩa là các trò chơi được thể hiện ở định dạng này không thể vượt quá 1023 lần di chuyển (nửa lần di chuyển kể từ lần bắt trước hoặc cầm đồ trước).
Định dạng đầy đủ của chúng tôi trông như thế này (trong trường hợp xấu nhất được đơn giản hóa với en passant có sẵn):
<position><whose move><castling><half moves><full moves><en passant>
320 bits 1 bit 4 bits 10 bits 10 bits 6 bits
Điều này mang lại cho chúng tôi tổng kích thước 351 bit trong trường hợp xấu nhất không thể xảy ra, ít hơn một nửa kích thước của điểm xuất phát của chúng tôi.
HÒA
Nếu chúng ta từ bỏ FEN hoàn toàn cho thịt của đại diện, chúng ta có thể giảm nó xuống một chút nữa. Hãy xem xét một hình vuông tùy ý. Hình vuông đó có thể trống, hoặc nó có thể có một mảnh trên đó. Nếu nó có một mảnh, nó có thể là màu trắng hoặc đen và nó có thể là Vua, Nữ hoàng, Rook, Giám mục, Hiệp sĩ hoặc Cầm đồ. Đó là tổng cộng mười ba trạng thái khác nhau, mà chúng ta có thể biểu thị bằng bốn bit; đại loại như thế này:
0000: empty square
0001: White Pawn
0010: White Knight
0011: White Bishop
0100: White Rook
0101: White Queen
0110: White King
0111: unused
1000: unused
1001: Black Pawn
1010: Black Knight
1011: Black Bishop
1100: Black Rook
1101: Black Queen
1110: Black King
1111: unused
Rõ ràng là có một số "bit một phần" chưa được sử dụng, do đó sơ đồ này gần như chắc chắn có thể được cải thiện hơn nữa bởi một người có kiến thức về kỹ thuật nén hơn, hoặc đơn giản là ánh xạ cẩn thận hơn về các trạng thái khác nhau. Ngoài ra trong thực tế, giá trị này có thể lớn hơn FEN nén được mô tả ở trên, do không có các khoảng trống liền kề. Tuy nhiên, nó đại diện cho toàn bộ bảng trong 256 bit không đổi (4 bit * 64 ô vuông), đây là một cải tiến 20% trong các trường hợp xấu nhất.
Để đơn giản, chúng tôi sẽ chỉ gắn thẻ vào nửa sau của FEN được nén để hoàn thành việc đại diện. Vì vậy, định dạng trông như thế này:
<position><whose move><castling><half moves><full moves><en passant>
256 bits 1 bit 4 bits 10 bits 10 bits 6 bits
Điều đó cung cấp cho chúng tôi một yêu cầu không gian trong trường hợp xấu nhất là 287 bit . Không tệ lắm!
Lưu ý 1: Hãy nhớ rằng, tất cả chỉ là phân tích trường hợp xấu nhất vì tôi có nền tảng khoa học máy tính. FEN tiêu chuẩn thường hoạt động tốt hơn nhiều so với tôi đã mô tả, vì các vị trí bình thường không phải là kịch bản bình phương của mọi người mà tôi đã sử dụng để so sánh ở đây. Vì vậy, phần trăm cải thiện có thể thấp hơn một chút so với thực tế tôi đã trình bày, nhưng xu hướng có thể vẫn còn, ít nhất là đối với đại diện FEN đã nén. Tôi rất quan tâm nếu ai đó muốn thực hiện phân tích trường hợp trung bình có xác suất cho FEN tiêu chuẩn (và bằng cách mở rộng, phiên bản nén được đề xuất ở trên)!
Lưu ý 2: Hãy nhớ rằng sự đánh đổi tốc độ để xử lý các định dạng nén có thể có hoặc không có giá trị đối với các ứng dụng của bạn! Tùy thuộc vào ngôn ngữ bạn đang sử dụng và mức độ kiểm soát bạn có trên các bit riêng lẻ, bạn có thể thấy rằng FEN đơn giản nhanh hơn đáng kể để sử dụng , ngay cả khi nó cần nhiều không gian hơn!
Lưu ý 3: Nếu bạn muốn thêm chỉ báo "kiểm tra / kiểm tra / không kiểm tra" vào một trong các ký hiệu được đề xuất mới, thì đó là thêm hai bit để thể hiện ba trạng thái bổ sung. Chỉ cần ném nó vào trước khi chỉ báo en passant .