Grand Prize

大賞

受賞者:Brian Westley

引用元:https://www.ioccc.org/1991/westley.c

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

動作

○×ゲーム。自分はXで、CPUは0。 1(左上)にXを置くには./westley 1と実行する。

$ gcc -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" -DJ=z[4] -DK=J[14] \
  -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" -o westley westley.c

$ ./westley 1
                a(X){/*/X=-             a(X){/*/X=-
        X       -1;F;X=-                -1;F;X=-
                -1;F;}/*/               -1;F;}/*/
char z[][99]={"char z[][99]={","a(X){/*/X=-","-1;F;X=-","-1;F;}/*/","1999999999  :-| ",
"int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*",
"z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z",
"[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P(",
"9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<<i++&",
"~Z));}R(){for(k=J[*J-48]-40;k;)e(w[k--],X|O);}main(u,v)char**v;{a(q=1);b(1);",
"c(1);*J=--u?O?*J:*v[1]:53;X|=u<<57-*v[u];y(X);K=40+q;q?e(O,X),q&&(K='|'),e(X",
",O),R(),O|=1<<--i:J[*J-48+(X=O=0)]--;L(q=0);for(s(i=0);q=i<12;)s(i++),i>4&&N",
";s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);}",0};
                b(X){/*/X=-             b(X){/*/X=-
                -1;F;X=-                -1;F;X=-
                -1;F;}/*/               -1;F;}/*/
int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*
z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z
[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P(
9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<<i++&
~Z));}R(){for(k=J[*J-48]-40;k;)e(w[k--],X|O);}main(u,v)char**v;{a(q=1);b(1);
c(1);*J=--u?O?*J:*v[1]:53;X|=u<<57-*v[u];y(X);K=40+q;q?e(O,X),q&&(K='|'),e(X
,O),R(),O|=1<<--i:J[*J-48+(X=O=0)]--;L(q=0);for(s(i=0);q=i<12;)s(i++),i>4&&N
;s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);}
                c(X){/*/X=-             c(X){/*/X=-
                -1;F;X=-        0       -1;F;X=-
                -1;F;}/*/               -1;F;}/*/

CPUが8番の位置(真ん中の列の下)に0を置いたことがわかる。 この出力は実行可能になっており、さらに○×ゲームを進めていくことができる。

解説

Quineの変種。

文字を置くところはX=- -1となっていて、間に空白が入ると1、0が入ると-1Xが入ると-2になる(Xは事前に1が入っている)。 このトリックによって、コード中に何が置かれているかを判定する。

westley.hintによると、9999999999のところをいじるとCPUの戦略が変えられるらしい(ちゃんと見てない)。

文字列リテラルを破壊しているために、そのままでは動かない。 レイアウトが崩れてしまうが、本格的に修正すると全体的な書き換えになってしまうので妥協した。

パッチ

パッチをダウンロード