引用元: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
が入ると-1
、X
が入ると-2
になる(X
は事前に1が入っている)。
このトリックによって、コード中に何が置かれているかを判定する。
westley.hintによると、9999999999
のところをいじるとCPUの戦略が変えられるらしい(ちゃんと見てない)。
文字列リテラルを破壊しているために、そのままでは動かない。
レイアウトが崩れてしまうが、本格的に修正すると全体的な書き換えになってしまうので妥協した。
パッチ
パッチをダウンロード