TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【芸術的な凄いプログラミング】IOCCC作品のコード解説6:迷路生成プログラミング

第二回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 );}
実行結果は以下の通り~。 IOCCC作品の解説:迷路生成プログラミング ・・・まぁ生成される迷路パターンは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); }
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ