もっとも複雑なASCII流体 - 選外佳作
xxxxxxxxxx
# include<stdio.h>// .IOCCC Fluid- #
# include <unistd.h> //2012 _Sim!_ #
# include<complex.h> //|||| ,____. IOCCC- #
# define h for( x=011; 2012/* #
# */-1>x ++;)b[ x]//-' winner #
# define f(p,e) for(/* #
# */p=a; e,p<r; p+=5)// #
# define z(e,i) f(p,p/* #
## */[i]=e)f(q,w=cabs (d=*p- *q)/2- 1)if(0 <(x=1- w))p[i]+=w*/// ##
double complex a [ 97687] ,*p,*q ,*r=a, w=0,d; int x,y;char b/* ##
## */[6856]="\x1b[2J" "\x1b" "[1;1H ", *o= b, *t; int main (){/** ##
## */for( ;0<(x= getc ( stdin) );)w=x >10?32< x?4[/* ##
## */*r++ =w,r]= w+1,*r =r[5]= x==35, r+=9:0 ,w-I/* ##
## */:(x= w+2);; for(;; puts(o ),o=b+ 4){z(p [1]*/* ##
## */9,2) w;z(G, 3)(d*( 3-p[2] -q[2]) *P+p[4 ]*V-/* ##
## */q[4] *V)/p[ 2];h=0 ;f(p,( t=b+10 +(x=*p *I)+/* ##
## */80*( y=*p/2 ),*p+=p [4]+=p [3]/10 *!p[1]) )x=0/* ##
## */ <=x &&x<79 &&0<=y&&y<23?1[1 [*t|=8 ,t]|=4,t+=80]=1/* ##
## */, *t |=2:0; h=" '`-.|//,\\" "|\\_" "\\/\x23\n"[x/** ##
## */%80- 9?x[b] :16];;usleep( 12321) ;}return 0;}/* ##
#### ####
###############################################################################
**###########################################################################*/
引用元:https://www.ioccc.org/2012/endoh1/endoh1.c
審査員・作者による説明:https://www.ioccc.org/2012/endoh1/hint.html
端末で流体シミュレーションをする。 水柱崩壊の例。
$ gcc endoh1.c -DG=1 -DP=4 -DV=8 -D_BSD_SOURCE -o endoh1 -lm
$ ./endoh1 < column.txt
,__.,___.
,_______/##||###\__.,. ,__.
|###/\#####||######\/| |##|
|##/\/#####||####|\\/\_. |##|
|##\/######||####||#||/\. |##|
|##\#######||###/\//\/||| |##|
|##\#######||###||#||#||| |##|
|##\#######||###||#||#||| |##|
|##\#######||###||#||#||| |##|
|##\#######||###||#||#||| |##|
|##\#######||###||#||#\/| |##|
|##\#######||###\/#\/|\#| |##|
|##\#######||##|\#/\#||#| |##|
|##########||##\/#\/|\/#\. |##|
|###\#\####||##/\\##|||\|\. |##|
|###\######||##\/|\#\/\/\/\_. |##|
|###'#--'##||#|-\'|'\'\'-\'-' |##|
|###\#\####\/#\_/\/\/\/\_/\____________________________________________/##|
`\#######################################################################/'
`-----------------------------------------------------------------------'
,__. ,__.
|##| |##|
|##| |##|
|##| |##|
|##| |##|
|##| |##|
|##| |##|
|##|,.,.,______. |##|
|##||||\/#####/\_. |##|
|##|/\/#\#####\/-\.,. ,. |##|
|##||\#\####\##\_/|/\__. |',. |##|
|##|||#\\####|\#\#'\/\#|,/\/|,__.,. |##|
|##|\/\##\\\#\###|\#\#\\/\#\\/##'/\____. |##|
|##\|\\/\#|##\#\\\###''#\\\#\|\\####\##\______. |##|
|###||\\/#\#'\\##|\#/'##/'###|/-'''\#/\\###/\#|,_. |##|
|###|/#\#|#'|#'-\'/'\\|\''#/-'\|#\/#\\/--'-\/\\/\',. |##|
|###\###\\##\##\#\#\/\\/###\#\#\##\\##\\/\_/###\/\/\___________________/##|
`\#######################################################################/'
`-----------------------------------------------------------------------'
,__. ,__.
|##| |##|
|##| |##|
|##| |##|
|##| ,_.,. |##|
|##| ,. ,. |#\/\. |##|
|##| |'___.`\_/\/'/'.|##|
|##| ,_. `\#|-'_/|\/'/'/'|##|
|##| `-' `\| `-''/'/\/\.|##|
|##|,. ,_. `' `\\##\||||##|
|##||' `'\. ,___/'\\#'/'|##|
|##|`' `'',. ,. ,. ,_. ,___/#/'-'#\'#\||##|
|##| ,. |' ,_/' ,.,.,_.,/\__/'|.,.|/\/\#|/\##\\##'|##|
|##|__/\.,_/\________________/\\_____/\/|/#\/\/\/\-'\/\/|#\/\\#/\|#-\#||##|
|##|/'\/'/#\#\\##\#\#\#\\#\#|#\#/\#\|\#|\##/\/'/\/'/#\#/\/'\#'#\#|###\||##|
|##\\//'/\/\|#/'-''-'##/-'\#'#\/'/#'\/|\/\\\/\###'#/\'-'\',/\|\/-'\\'/'|##|
|##\#\\/\/\#\#\/\/\/\##\/\###\#\#\#\/\\#\/##\#\##\#\/\__/\/\/\/\\\/##\\/##|
`\#######################################################################/'
`-----------------------------------------------------------------------'
コード自身も溶かせる。
,. ,_________________. ,_____. ,_____. ,
|| |######/\#########| |#####| |#####| |
|| |######\/#########| |#####| ,_____. |#####| |
|| |#####/-----------' |/\###| |#####| |#####| |
|| |#####| |\/###| |#####| |#####| |
|| |#####| |#####| `-----' |#####| |
|| |#####| |#####| ,/#####| |
|| |#####| |#####| |######| |
|\.|#####\___________. |#####| ,_____. ,_____. ,_____. ,______/######|,/
`-'|#####/\######/\/\| |#####| |#####| |#####| |#####| ,_//\#######/\##||#
,_.|#####\/######\/\/| |#####| |#####| |#/\##| |#/\##| ,/#/\/##/--\#\/##||#
|#||#####/-----------' |#####| |###/\| |#\/##| |#\/##| ,/##\/#/-' |#####||#
|#||#####| |#####| |###\/| |#####| |#####| |#####/' |#####||#
|#||#####| |#####| |#####| |#####| |#####| |#####| |#####||#
|#||#####| |#####| |#####| |#####| |#####| |#####| |#####||#
|#||#####| |#####| |#####| |#####| |#####| |#####| |#####||#
|#||#####| |#####| |#####\. |#####| |#####| |#####\. |#####||#
|#||#/\##| |#####| `\#####\___/#####| |#####| `\#####\____/#####||#
|#||#\/\#| |#####| `\##/\##########| |#####| `\###############||#
|#||##\/#| |#####| `-\\/##########| |#####| `-\#######/\####||#
|#\//----' `-----' `------------' `-----' `-------'`---\\/#
|###\______________________________________________________________________/###
|##############################################################################
`------------------------------------------------------------------------------
,. ,
|| |
|| ,___.,____. |
||,____/---'`----\__. |
|||####\___.,____/##\.,____.,. ,_.,_.,_. |
|||#####/--'`--------'`--'-'`\. ,.|/'`-\//' |
|||##/\\\_.,_______________. `',_. ,.,. ,/|`' ,_/\\. |
||/\#\/#/-'|#/----\#####|-\| |/\_. ,_.`'`',_. ,_/\| ,/\\/#\.|
|\/\\\##\__/#\____/#####| || ||`\| ,_/-',.,.`-\_. ,/''|| ,/\/##|'\/
`-'`\|\#\##\#\#######/\|' || || || |#| |||| |#| || ||,/\/\#|' |#
,_.,/|\##\\#\###-\##\|`\. `\. || `\. `-\_.`'`',_/-' ,/\. |||\/\/-' |#
|#|||\/|\#\#|\\#\/\|\| || || || ,/| |#|,.,.|#| ,/\#\_/\//\\\_. |#
|#|`'/\\//\\\/##\\/||| || ||,_/\_/#\_. ,_. ,.,_/\\/\/\/\|,_/---\/\##\/\/'\. |#
|#|,/\#|\\/#\#/\##\\/\.|| ,/|||\###/-\\_/#|,/\/#||#\/\/\/||\#\__/\/###\/\_/| |#
|#|||'\\/\####\/###\##|||,/|\/\/###\.|##|\||\/\#||#/\/\/#\/##|\######\##\/\| |#
|#||| |#||###/-\##|\##|||||\/\|\/\##\/##\/||#\/\||#\/\#|\####||###\#|\#\#||| |#
|#|||,/|\/###\_/\#\/##||\/\/\/\/||##/\/\\#\/\#||||\#\/#\/##\#\/##\##\/###\/\.|#
|#||\//\/###\\/\######\/\||||\/\\/##\/\/|\\##/\/||#\########\###\\#|\|\#|\##||#
|#|/#\\/###\##\/\\###\#\/\/\/\\#\#\###\#\/\\#||#||\\##\\###\##\##\#\/\/#||#\||#
|#||\|###\#\#\\#/\\#\#\#\#\#\/\#\##|\##\##\##\//'|\\/\####/\#\##'\\##/\#\/##||#
|#\\/|\#\#\###\#\/\#'\|\#\/\##/\#\#'/###\#\#\#|\_/|#\/\\##\/\/\\\//\#\/\#\/\\/#
|###\\/\\#\#\#\\##\###\/\#\/\\\/\########\#\##\#\#\#####\\#\#\/###\/\#####\/###
`-\##########################################################################/-
`--------------------------------------------------------------------------'
,. ,
|| |
|| |
|| ,. ,. ,. |
|| ,. `' `' `' |
|| `' ,___. ,. |
|| ,/'/'\_.,_.,. `' ,. |
|| ,. ,.|/'\_/\|/#'/| ,. ,. `' |
|\.,/|. ,. ,.`'|'\/---'#\#/'.,. |\. `' ,. ,/
`-'|-'' `' ,. ,__/',_/\/|//\#\|/'/'/',.,//',. ,. ,/\. |#
,_.|-',_. `' ,_. ,___/'#'\//\#''-'##/'\|\/\||\/\|_/|___.,_. ||. `\/' |#
|#|`\.|#'_. ,_. ,.,//'.|\/\|/#\/\\/'\/\/\\|'|'#'/'/#|||/\\/-''/\|,.,/''.,/'. |#
|#|,/\/''/'_/\\_/'/''/'/#'#|\'-'/\'--\/\/\|_/-\|/\#'\/'|\''|/#'-'/\/\.|'/'/' |#
|#||'||\/\//'\/''-'\\\/\-\/'#\\#\/'#|/'/\/'\\//'\/'\/'#\/'#|#'\#\\/''\/\\/',.|#
|#|/\/'/\/-\/\'/'\_/'\||\/'#-\\|\|/#'\'-'''`\/\/'\|||//\|/\\#\/\|\'/\/#\#''/'|#
|#|##|\|#'\/'/\\\/\\/\\/\\#\#\|\/'\\|/\'/\\_/'#\##'/\#|#'\#-\#|\|#'\####|\#|||#
|#|\''#'\\#\|##\#\#-\/|\#'\|##\#|/#\\##\##/\#/'#\\#''\\#\#'\#\'\\#\/\/-\\#'\||#
|#|/#|/'\#\/\#\#\#|\/-'#\|#|\#-''##\|\#|\\|-'\#\\#''\/'##'\'\/'#'#\/''\/''\/'|#
|#|\''\\/'||/'-\|'\#'##\#\#|\''\|\'#|#\'#/'\##|#-''\/\##'|###'/\#'#|\/#\/\#' |#
|#|#'|/''|'\/\##'--'\/'-'--'#'##'/#-'\#\-\#|##|\\/'#'--'#'\#|#'\\\/'\/\/'\'' |#
|#\#|\|/'`'\\/'''\|\#'/\|\/\|\#'\'\|/''-'-'|\-'/-'\|\/#''|#-'/\/'-'/-'-''-',_/#
|###\/\#\__/#\___/\/\\\/\#\#\##\/\/\\_/##\#\#\\\\\/\/#\\/\#\#\/\__/\/\_____/###
`-\##########################################################################/-
`--------------------------------------------------------------------------'
作者自身によるデモ動画。
SPH法による流体シミュレーション。 流体を粒の集まりとし、粒同士の圧力と粘性をシミュレーションすることで流体の動きを表現する。 表示にはマーチングスクエア法を用いる。
初期配置は80x24のテキストとして与える。
#
の位置の粒子は固定(壁)、それ以外の非空白文字は動く粒子とみなす。
コンパイルオプションの-DG=1 -DP=4 -DV=8
はそれぞれ、重力、粒子同士の圧力、粒子同士の粘性の強さを表す。
動作例で示したとおり、コード形状はシミュレーションの初期配置になっている。
#
を固定粒子としたのは#include
をそのまま利用するため。
実装上の特徴としては、C99で導入されたcomplex
型を活用して2次元ベクトルを表現している。
なお、直感とちがい、実数方向が縦、虚数方向が横。
これにより、重力を計算するときforce += G * I
ではなくforce += G
で済む。
double complex a[]
は5要素で1粒子を表現していて、それぞれ位置ベクトル、固定フラグ、密度、力、粘性を表す。
審査員コメントにあるJeopardy!は、アメリカの古いクイズ番組。 問題の解答を聞いて、問題文を当てる。
「答え:複素数を扱い、ASCIIグラフィックスアニメーションする難読化されたプログラム。」 「問題:マンデルブロシミュレータ?」 ブー。
賞名の”complex”は、「複雑な」と「複素数」をかけている。
審査員はこのプログラムの挙動をはじめて見たとき、”Wow!“とツイートしたとのこと。