トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> 物凄いコード集 >> 迷路生成プログラミング (C言語)

迷路生成 (C言語 - IOCCC)

第二回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<C*R&&l[s]!=k%C&&(!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=j<f?f:j;f+=c&-16*!j;M[g]=
c|1<<s;M[*d++=e]=f|1<<(s+2)%4;}else e=d>b++?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
);}
実行結果は以下の通り~。 迷路生成プログラミング (C言語-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=j<f?f:j;f+=c&-16*!j;M[g]=
c|1<<s;M[*d++=e]=f|1<<(s+2)%4;}else e=d>b++?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 = j<f ? f : j;
            f+=c & -16 * !j;
            M[g] = c | 1<<s;
            M[*d++ = e] = f | 1<<(s+2)%4;
        }
        else
            e = d>b++ ? 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);
}
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。