[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 さんのアイデア)。この形はめっちゃ気に入っているのですが、内容がついていかなかったので申し訳ない。