Best AI

最高のAI

受賞者:Doug Beardsley

引用元:https://www.ioccc.org/2001/dgbeards.c

審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/2001/dgbeards.hint

動作

負けるが勝ちのチェス。

$ gcc -DE=break -DF=char -DK=case -DP=int -DR=return -DI=0xFFFF -o dgbeards dgbeards.c

$ ./dgbeards
 +---+---+---+---+---+---+---+---+
8| *R| *N| *B| *Q| *K| *B| *N| *R|
 +---+---+---+---+---+---+---+---+
7| *P| *P| *P| *P| *P| *P| *P| *P|
 +---+---+---+---+---+---+---+---+
6|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
5|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
4|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
3|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
2| P | P | P | P | P | P | P | P |
 +---+---+---+---+---+---+---+---+
1| R | N | B | Q | K | B | N | R |
 +---+---+---+---+---+---+---+---+

K(キング)の前のP(ポーン)を前に出してみる。 チェスでは左列から右列へabcdefgh、下行から上行へ12345678の番号が振られていて、どのマスからどのマスへ移動するかを並べて書く。 この場合はe2e4

e2e4
 +---+---+---+---+---+---+---+---+
8| *R| *N| *B| *Q| *K| *B| *N| *R|
 +---+---+---+---+---+---+---+---+
7| *P| *P| *P| *P| *P| *P| *P| *P|
 +---+---+---+---+---+---+---+---+
6|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
5|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
4|   |   |   |   | P |   |   |   |
 +---+---+---+---+---+---+---+---+
3|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
2| P | P | P | P |   | P | P | P |
 +---+---+---+---+---+---+---+---+
1| R | N | B | Q | K | B | N | R |
 +---+---+---+---+---+---+---+---+

次は相手の番。 AIに打たせるならgと打つ(ちなみに、自分の手番でもgでAIに代わりに動かしてもらえるし、相手のコマの動かし方を指定することもできる)。

g
Value 129
 +---+---+---+---+---+---+---+---+
8| *R| *N| *B| *Q| *K| *B| *N| *R|
 +---+---+---+---+---+---+---+---+
7| *P| *P| *P| *P| *P|   | *P| *P|
 +---+---+---+---+---+---+---+---+
6|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
5|   |   |   |   |   | *P|   |   |
 +---+---+---+---+---+---+---+---+
4|   |   |   |   | P |   |   |   |
 +---+---+---+---+---+---+---+---+
3|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
2| P | P | P | P |   | P | P | P |
 +---+---+---+---+---+---+---+---+
1| R | N | B | Q | K | B | N | R |
 +---+---+---+---+---+---+---+---+

ポーンは斜めにコマを取れる。 このチェスでは取れるコマがあるときは必ず取らないといけない。 他のムーブはできない。

e4f5
 +---+---+---+---+---+---+---+---+
8| *R| *N| *B| *Q| *K| *B| *N| *R|
 +---+---+---+---+---+---+---+---+
7| *P| *P| *P| *P| *P|   | *P| *P|
 +---+---+---+---+---+---+---+---+
6|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
5|   |   |   |   |   | P |   |   |
 +---+---+---+---+---+---+---+---+
4|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
3|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
2| P | P | P | P |   | P | P | P |
 +---+---+---+---+---+---+---+---+
1| R | N | B | Q | K | B | N | R |
 +---+---+---+---+---+---+---+---+
g
Value 7
 +---+---+---+---+---+---+---+---+
8| *R| *N| *B| *Q| *K| *B| *N| *R|
 +---+---+---+---+---+---+---+---+
7| *P|   | *P| *P| *P|   | *P| *P|
 +---+---+---+---+---+---+---+---+
6|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
5|   | *P|   |   |   | P |   |   |
 +---+---+---+---+---+---+---+---+
4|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
3|   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+
2| P | P | P | P |   | P | P | P |
 +---+---+---+---+---+---+---+---+
1| R | N | B | Q | K | B | N | R |
 +---+---+---+---+---+---+---+---+

相手はb5にポーンを動かしてきたが、これはf1のB(ビショップ)で取れるので、それ以外の動きは許されない。

このようにコマを進めあって、合法ムーブがなくなったら(全部のコマが取られたら)勝ち。 なお、キングを取られても終わりではない。

解説

負けたらsegfaultする。 これがこのジャンルのプログラムのスポーツマンシップであろうとのこと。

{};と空白からなる文字列リテラルは、IOCCCのサイズ制限を回避しつつテーブルを埋め込むためのテクニック。