Best of Show

最優秀賞

受賞者:Vern Paxson

引用元: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などの基本的な定数をあえて確率的な方法で算出している、などが挙げられている。