第二回IOCCCのグランプリ作品から、面白いコードをご紹介します。
下記のコード、なんと実行するだけで迷路が生成されちゃうんです^^;)
#define P(X)j=write(1,X,1)
#define C 39
int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,C-1,-1},m[]={1,-C,-1,C},*b=N,
*d=N,c,e,f,g,i,j,k,s;main(){for(M[i=C*R-1]=24;f|d>=b;){c=M[g=i];i=e;for(s=f=0;
s<4;s++)if((k=m[s]+g)>=0&&k=16!=M[k]>=16))a[f++
]=s;if(f){f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];j=jb++?b[-1]:e;}P(" ");for(s=C;--s;P("_")
)P(" ");for(;P("\n"),R--;P("|"))for(e=C;e--;P("_ "+(*u++/8)%2))P("| "+(*u/4)%2
);}
実行結果は以下の通り~。
・・・まぁ生成される迷路パターンは1つだけなんですが、
それでも、このコードの短さで、わりと複雑な迷路を表示できるというのが凄いっ!
というわけで、早速コードを読んで行きます^^;)
まず、いつもの如くプリプロセッサの実行結果を表示させます。
int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,39-1,-1},m[]={1,-39,-1,39},*b=N,
*d=N,c,e,f,g,i,j,k,s;main(){for(M[i=39*R-1]=24;f|d>=b;){c=M[g=i];i=e;for(s=f=0;
s<4;s++)if((k=m[s]+g)>=0&&k<39*R&&l[s]!=k%39&&(!M[k]||!j&&c>=16!=M[k]>=16))a[f++
]=s;if(f){f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];j=jb++?b[-1]:e;}j=write(1," ",1);for(s=39;--s;j=write(1,"_",1)
)j=write(1," ",1);for(;j=write(1,"\n",1),R--;j=write(1,"|",1))for(e=39;e--;j=write(1,"_ "+(*u++/8)%2,1))j=write(1,"| "+(*u/4)%2,1);}
そして、適当にインデント・空白を入れます。
int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,39-1,-1},m[]={1,-39,-1,39},*b=N,
*d=N,c,e,f,g,i,j,k,s;
main()
{
for (M[i = 39*R-1] = 24; f|d >= b;) {
c = M[g = i];
i = e;
for (s = f = 0; s<4; s++)
if ( (k=m[s]+g) >= 0
&& k < 39*R
&& l[s] != k % 39
&& (! M[k] || !j && c >= 16 != M[k] >= 16)
)
a[f++] = s;
if (f) {
f = M[ e= m[s = a[rand()/(1+2147483647/f)]] + g];
j = jb++ ? b[-1] : e;
}
j=write(1, " " , 1);
for (s = 39; --s; j = write(1,"_",1))
j = write(1, " ", 1);
for(; j = write(1,"\n",1), R--; j = write(1, "|", 1))
for(e = 39; e--; j = write(1,"_ " + (*u++/8)%2,1))
j = write(1, "| " + (*u/4)%2, 1);
}