あなたはプログラミングについて話しているので、おそらくFENよりもコンピュータのメモリ空間でよりコンパクトなストレージスキームを探しているでしょう。大きなテーブルベースでそれがどのように行われるかを調査することに加えて、2つの可能性がすぐに思い浮かびます。
通常のFEN
この説明のために、「通常の」FENは、1バイト(8ビット)文字で表される単なる典型的なテキスト文字列です。単純化された最悪のケースを見てみましょう:
r1b1k1n1/1p1p1p1p/p1p1p1p1/1n1q1b1r/R1B1P1N1/1P1P1P1P/P1P1K1P1/1N1Q1B1R w KQkq e3 999 999
もちろん、これは有効なFENではありませんが、複雑さの有効な上限です。ランクごとに8文字、プラス7つのスラッシュ、5つのスペース、および13の追加文字が残りのフィールドを構成します。これは89文字で、合計サイズは712ビットです。
圧縮FEN
このバージョンは、FEN表現を採用し、いくつかの基本的な観察を使用して、それを格納するために必要なビット数を削減しています。ここに私たちの観察があります:
- マシンの保管にはスラッシュは不要です。各ランクは単に「8に加算」する必要があります。そのため、内部表現のスラッシュを排除できます。
- 残りの可能な文字(最初のセクション)は次のとおり
kK qQ rR bB nN pP 12345678
です。20文字の区別は5ビットに収まるので、単純化した最悪のケースでは、5ビットx 8ファイルx 8ランクで、最初の部分は320ビットです。
- スペースは必要ありません。再び彼らは人間にとって便利です。これで5文字節約できます。
- 「誰が動くのか」は1ビットです。白か黒です。
- Castlingの可用性は4ビットです
KQkq
。それぞれで使用可能/使用不可です。
- En passantは通常は使用できず、多くのスペース(6ビットですべての正方形を表す)を占める可能性があるため、最後に移動してオプションにします。enpassantビットが存在する場合は使用できますが、使用できない場合はスペースを節約するために、移動および半移動ビットの後に表現を終了するだけです。
- 簡単にするために、移動と半移動の各カウンターに10ビットを割り当てています。つまり、この形式で表されるゲームは1023移動(最後のキャプチャまたはポーンの前進からの半分の移動)を超えることはできません。
私たちの完全なフォーマットは次のようになります(en passantが利用可能な簡略化された最悪の場合):
<position><whose move><castling><half moves><full moves><en passant>
320 bits 1 bit 4 bits 10 bits 10 bits 6 bits
これにより、不可能な最悪の場合の合計サイズは351ビットになり、開始点のサイズの半分未満になります。
µFEN
表現の肉のためにFENを完全に放棄すると、もう少しスリムにすることができます。単一の任意の正方形を考えます。その正方形は空である場合もあれば、その上に駒がある場合もあります。駒がある場合、それは白または黒のいずれかであり、キング、クイーン、ルーク、ビショップ、ナイト、またはポーンです。これは合計13の異なる状態であり、4ビットで表すことができます。このようなもの:
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
明らかに、いくつかの未使用の「部分ビット」があるため、この手法は、圧縮技術の知識がある人、または単に異なる状態のより注意深いマッピングによって、ほぼ間違いなくさらに改善できる可能性があります。また、実際には、隣接する空白スペースの圧縮がないため、これは上記の圧縮FEN よりも大きくなる可能性があります。ただし、ボード全体を常に256ビット(4ビット* 64平方)で表します。これは、最悪の場合で20%改善されます。
簡単にするために、圧縮FENの後半にタグを付けるだけで表現を完成させます。したがって、フォーマットは次のようになります。
<position><whose move><castling><half moves><full moves><en passant>
256 bits 1 bit 4 bits 10 bits 10 bits 6 bits
これにより、ワーストケースのスペース要件が287ビットになります。悪くない!
注1:私はコンピューターサイエンスの経験があるため、これはすべて最悪のケースの分析にすぎません。標準のFENは通常、私が説明したよりもはるかに優れたパフォーマンスを発揮します。これは、通常の位置が、ここでの比較に使用した全員のシナリオではないためです。したがって、改善率は実際に私が実際に示したものより少し低い可能性が高いですが、少なくとも圧縮されたFEN表現については、傾向はおそらくまだ残っています。誰かが標準のFEN(ひいては上記で提案された圧縮バージョン)の確率論的平均ケース分析を実行したい場合は、非常に興味があります。
注2:圧縮形式を処理するための速度のトレードオフは、アプリケーションにとって価値がある場合とない場合があることに注意してください。使用している言語と個々のビットに対する制御レベルによっては、より多くのスペースが必要な場合でも、単純なFENの方がはるかに高速に使用できる場合があります。
注3:新しく提案された表記のいずれかに「チェック/チェックメイト/チェックなし」インジケーターを追加する場合、それは3つの追加の状態を表す追加の2ビットです。en passantインジケーターの前に投げ込みます。