引用元:https://www.ioccc.org/1992/vern.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1992/vern.hint
動作
チェスAI。コマンドライン引数で強さ(読みの深さ)を指定できる。
次のように起動する。
$ sed < vern.c 's/{ /(/g;s/} /)/g;s/;\t/#define /' | sed 's/}\t/=/g;s/{\t/i/g' >vern.tmp.c
$ gcc -o vern vern.tmp.c
$ ./vern 3
0 r n b q k b n r
10 p p p p p p p p
20 - - - - - - - -
30 - - - - - - - -
40 - - - - - - - -
50 - - - - - - - -
60 P P P P P P P P
70 R N B Q K B N R
0 1 2 3 4 5 6 7
1 0 0 >
プロンプトが出るので、64 44
などと入力する。
これで66の位置にあるポーンを64に移動できる。
1 0 0 > 64 44
0 r n b q k b n r
10 p p p p p p p p
20 - - - - - - - -
30 - - - - - - - -
40 - - - - P - - -
50 - - - - - - - -
60 P P P P - P P P
70 R N B Q K B N R
0 1 2 3 4 5 6 7
.....................
0 r n b q k b - r
10 p p p p p p p p
20 - - - - - n - -
30 - - - - - - - -
40 - - - - P - - -
50 - - - - - - - -
60 P P P P - P P P
70 R N B Q K B N R
0 1 2 3 4 5 6 7
1351 9 2 >
CPUが06の位置にあるナイトを25に移動したことがわかる。
このようにすすめていく。
解説
アルファベータ法によるチェスAIとのこと。
プロンプトの数字は、「読んだ盤面の数、直前のムーブの期待値、盤面の評価値(大きいほうが人間有利)」らしい。
チェック(王手)の場合はプロンプトの>
が!
になる。
プログラムは空白の入り方が独特の雰囲気になっている。
これは、この年のIOCCCのルール変更による。
1991年のルールは「作品は1536バイト以下であること」だったけれど、1992年は「作品は3217バイトであること。また、空白以外の文字の数は1536個以下であること(ただし;
か{
か}
で、その後に空白文字が来るものはカウントしない)」というややこしいルールになった。
このプログラムはこのルールを悪用し、;
{
}
の文字と空白を使って本来のプログラムをエンコードしている。
コンパイルするには、sedコマンドでデコードを行う必要がある。
そのままコンパイルできないのはちょっとズルすぎる気も。
このややこしい文字カウントルールを悪用することは、今後もIOCCC独自の定番ネタとなり、頻出する。
他の難読化としては、変数名を1文字にする、盤面をあえて関数ポインタの配列で表現する、可能なムーブを列挙するための関数を定義していない、64や8などの基本的な定数をあえて確率的な方法で算出している、などが挙げられている。