[C][IOCCC] IOCCC 2015 落選作供養 (3): 文字の群れシミュレータ

           #include\
             <unistd.h>
               float(e),
                g,h,J[]={0           ,1,2};
                  #include/*    -*/<stdio.h>
                    char(T)[ 1999]="\x1b[H"  "\x1b[2J"
                    ;int(i);float/*            */_Complex
                *I=(void*)J,v,f,b                [9999],*p
=b,*q;int   main(){for(;p+=(i/*                /  */=getchar           (),/*,
  */i>32?*p= f,p[2]=i,3:0)/*                  /     */;f=i<11?    i=f+2:f/*.>>
    */+*I)if(   i<0){/*;                      |   o   */for(i= 0,puts(T),/**'
     */usleep(+           5000/*              \       */);i++<1919;)T
       [i+2]=i%80    ?32:10;/*.>>              \  */for(q=b;q<p;f=*
         I*79,v=* q+(q[1]/=4)/*^  *//4+f+48   ,i=v/f,v-=f*i,i=v/+
         48,i=*q=v-i*48,            T[i=3+i/2* 80-*I*v]=q[2],q
     +=3)for(f=q[1],i=                b-p;i<9;i   >=0?p[i]
 =0,q[1]+=v?v/g:f:+g                   &&g<8?*p-=           g<4/*,
  */?v/e:0,p[3]+=                        p[i+1],p[6    ]+=p[i]/*.>>
     */-*q:0,                              i+=3)for (h=v=p[i]-(/*`
                                           */i<0)**q,g=e=v
                                       *h*2-v*v;e&&g-h;g
                                   =(h+e/h)/2)h=g;}}/*
                                    fly-swim-swarm-
                                       -IOCCC*/

鳥が 4 羽、魚が 1 匹の絵です。なんか適当にテキストファイルを食わせて実行すると、文字が群れを成してうごめきます。

$ gcc -o prog prog.c
$ ./prog < prog.c

Boids のシミュレータです。各文字が鳥だか魚だかっぽい人工生命(大げさ)になって、以下の規則にしたがってうごめきます。

  • なるべく近隣の文字に近づきすぎない(衝突回避)
  • なるべく近隣の文字から離れすぎない(迷子防止)
  • なるべく近隣の文字と同じ方向に進む(同調圧力

主体性のない生命ですね……。でもそれぞれがこの規則に従うだけで、全体が群れを成して動くんだから面白い。

戦略と狙い

Boids は以前から IOCCC 向けに一回やっておきたかったネタなのですが、テキスト流体シミュレーションの二番煎じにとどまった格好です。_Complex を使っているところも同じ。実質 600 バイト程度で、まずまずコンパクトに書けたなーと思ってますが、インパクトは流体シミュ以下ですかね。

鳥と魚の絵なのはエッシャーの「空と水」のリスペクトです(@hirekoke さんのアイデア)。この形はめっちゃ気に入っているのですが、内容がついていかなかったので申し訳ない。