Most complex ASCII fluid - Honorable mention
もっとも複雑なASCII流体 - 選外佳作
受賞者:Yusuke Endoh
引用元: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!“とツイートしたとのこと。