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




        ,__.,___.
,_______/##||###\__.,.                                                 ,__.
|###/\#####||######\/|                                                 |##|
|##/\/#####||####|\\/\_.                                               |##|
|##\/######||####||#||/\.                                              |##|
|##\#######||###/\//\/|||                                              |##|
|##\#######||###||#||#|||                                              |##|
|##\#######||###||#||#|||                                              |##|
|##\#######||###||#||#|||                                              |##|
|##\#######||###||#||#|||                                              |##|
|##\#######||###||#||#\/|                                              |##|
|##\#######||###\/#\/|\#|                                              |##|
|##\#######||##|\#/\#||#|                                              |##|
|##########||##\/#\/|\/#\.                                             |##|
|###\#\####||##/\\##|||\|\.                                            |##|
|###\######||##\/|\#\/\/\/\_.                                          |##|
|###'#--'##||#|-\'|'\'\'-\'-'                                          |##|
|###\#\####\/#\_/\/\/\/\_/\____________________________________________/##|
`\#######################################################################/'
 `-----------------------------------------------------------------------'








,__.                                                                   ,__.
|##|                                                                   |##|
|##|                                                                   |##|
|##|                                                                   |##|
|##|                                                                   |##|
|##|                                                                   |##|
|##|                                                                   |##|
|##|,.,.,______.                                                       |##|
|##||||\/#####/\_.                                                     |##|
|##|/\/#\#####\/-\.,.    ,.                                            |##|
|##||\#\####\##\_/|/\__. |',.                                          |##|
|##|||#\\####|\#\#'\/\#|,/\/|,__.,.                                    |##|
|##|\/\##\\\#\###|\#\#\\/\#\\/##'/\____.                               |##|
|##\|\\/\#|##\#\\\###''#\\\#\|\\####\##\______.                        |##|
|###||\\/#\#'\\##|\#/'##/'###|/-'''\#/\\###/\#|,_.                     |##|
|###|/#\#|#'|#'-\'/'\\|\''#/-'\|#\/#\\/--'-\/\\/\',.                   |##|
|###\###\\##\##\#\#\/\\/###\#\#\##\\##\\/\_/###\/\/\___________________/##|
`\#######################################################################/'
 `-----------------------------------------------------------------------'








,__.                                                                   ,__.
|##|                                                                   |##|
|##|                                                                   |##|
|##|                                                                   |##|
|##|                                                            ,_.,.  |##|
|##|                                                   ,.    ,. |#\/\. |##|
|##|                                                   |'___.`\_/\/'/'.|##|
|##|                                       ,_.         `\#|-'_/|\/'/'/'|##|
|##|                                       `-'          `\| `-''/'/\/\.|##|
|##|,. ,_.                                               `'   `\\##\||||##|
|##||' `'\.                                                ,___/'\\#'/'|##|
|##|`'  `'',.                  ,.            ,.  ,_.   ,___/#/'-'#\'#\||##|
|##|  ,.   |'                ,_/'    ,.,.,_.,/\__/'|.,.|/\/\#|/\##\\##'|##|
|##|__/\.,_/\________________/\\_____/\/|/#\/\/\/\-'\/\/|#\/\\#/\|#-\#||##|
|##|/'\/'/#\#\\##\#\#\#\\#\#|#\#/\#\|\#|\##/\/'/\/'/#\#/\/'\#'#\#|###\||##|
|##\\//'/\/\|#/'-''-'##/-'\#'#\/'/#'\/|\/\\\/\###'#/\'-'\',/\|\/-'\\'/'|##|
|##\#\\/\/\#\#\/\/\/\##\/\###\#\#\#\/\\#\/##\#\##\#\/\__/\/\/\/\\\/##\\/##|
`\#######################################################################/'
 `-----------------------------------------------------------------------'



コード自身も溶かせる。

,. ,_________________. ,_____.                                        ,_____. ,
|| |######/\#########| |#####|                                        |#####| |
|| |######\/#########| |#####|                    ,_____.             |#####| |
|| |#####/-----------' |/\###|                    |#####|             |#####| |
|| |#####|             |\/###|                    |#####|             |#####| |
|| |#####|             |#####|                    `-----'             |#####| |
|| |#####|             |#####|                                       ,/#####| |
|| |#####|             |#####|                                       |######| |
|\.|#####\___________. |#####| ,_____.    ,_____. ,_____.     ,______/######|,/
`-'|#####/\######/\/\| |#####| |#####|    |#####| |#####|   ,_//\#######/\##||#
,_.|#####\/######\/\/| |#####| |#####|    |#/\##| |#/\##|  ,/#/\/##/--\#\/##||#
|#||#####/-----------' |#####| |###/\|    |#\/##| |#\/##| ,/##\/#/-'  |#####||#
|#||#####|             |#####| |###\/|    |#####| |#####| |#####/'    |#####||#
|#||#####|             |#####| |#####|    |#####| |#####| |#####|     |#####||#
|#||#####|             |#####| |#####|    |#####| |#####| |#####|     |#####||#
|#||#####|             |#####| |#####|    |#####| |#####| |#####|     |#####||#
|#||#####|             |#####| |#####\.   |#####| |#####| |#####\.    |#####||#
|#||#/\##|             |#####| `\#####\___/#####| |#####| `\#####\____/#####||#
|#||#\/\#|             |#####|  `\##/\##########| |#####|  `\###############||#
|#||##\/#|             |#####|   `-\\/##########| |#####|   `-\#######/\####||#
|#\//----'             `-----'     `------------' `-----'     `-------'`---\\/#
|###\______________________________________________________________________/###
|##############################################################################
`------------------------------------------------------------------------------


,.                                                                            ,
||                                                                            |
||     ,___.,____.                                                            |
||,____/---'`----\__.                                                         |
|||####\___.,____/##\.,____.,.                                      ,_.,_.,_. |
|||#####/--'`--------'`--'-'`\.                                   ,.|/'`-\//' |
|||##/\\\_.,_______________. `',_.                 ,.,.          ,/|`' ,_/\\. |
||/\#\/#/-'|#/----\#####|-\|   |/\_.            ,_.`'`',_.     ,_/\|  ,/\\/#\.|
|\/\\\##\__/#\____/#####| ||   ||`\|          ,_/-',.,.`-\_.  ,/''|| ,/\/##|'\/
`-'`\|\#\##\#\#######/\|' ||   || ||          |#|  ||||  |#|  ||  ||,/\/\#|' |#
,_.,/|\##\\#\###-\##\|`\. `\.  || `\.         `-\_.`'`',_/-' ,/\. |||\/\/-'  |#
|#|||\/|\#\#|\\#\/\|\| ||  ||  || ,/|           |#|,.,.|#|  ,/\#\_/\//\\\_.  |#
|#|`'/\\//\\\/##\\/||| ||  ||,_/\_/#\_. ,_. ,.,_/\\/\/\/\|,_/---\/\##\/\/'\. |#
|#|,/\#|\\/#\#/\##\\/\.|| ,/|||\###/-\\_/#|,/\/#||#\/\/\/||\#\__/\/###\/\_/| |#
|#|||'\\/\####\/###\##|||,/|\/\/###\.|##|\||\/\#||#/\/\/#\/##|\######\##\/\| |#
|#||| |#||###/-\##|\##|||||\/\|\/\##\/##\/||#\/\||#\/\#|\####||###\#|\#\#||| |#
|#|||,/|\/###\_/\#\/##||\/\/\/\/||##/\/\\#\/\#||||\#\/#\/##\#\/##\##\/###\/\.|#
|#||\//\/###\\/\######\/\||||\/\\/##\/\/|\\##/\/||#\########\###\\#|\|\#|\##||#
|#|/#\\/###\##\/\\###\#\/\/\/\\#\#\###\#\/\\#||#||\\##\\###\##\##\#\/\/#||#\||#
|#||\|###\#\#\\#/\\#\#\#\#\#\/\#\##|\##\##\##\//'|\\/\####/\#\##'\\##/\#\/##||#
|#\\/|\#\#\###\#\/\#'\|\#\/\##/\#\#'/###\#\#\#|\_/|#\/\\##\/\/\\\//\#\/\#\/\\/#
|###\\/\\#\#\#\\##\###\/\#\/\\\/\########\#\##\#\#\#####\\#\#\/###\/\#####\/###
`-\##########################################################################/-
  `--------------------------------------------------------------------------'



,.                                                                            ,
||                                                                            |
||                                                                            |
||          ,.                 ,.     ,.                                      |
||   ,.     `'                 `'     `'                                      |
||   `'                            ,___.                     ,.               |
||                                ,/'/'\_.,_.,.              `'           ,.  |
||  ,.                          ,.|/'\_/\|/#'/|      ,.          ,.       `'  |
|\.,/|.  ,.                   ,.`'|'\/---'#\#/'.,.   |\.         `'      ,.  ,/
`-'|-''  `' ,.             ,__/',_/\/|//\#\|/'/'/',.,//',.          ,.  ,/\. |#
,_.|-',_.   `'     ,_. ,___/'#'\//\#''-'##/'\|\/\||\/\|_/|___.,_.   ||. `\/' |#
|#|`\.|#'_. ,_. ,.,//'.|\/\|/#\/\\/'\/\/\\|'|'#'/'/#|||/\\/-''/\|,.,/''.,/'. |#
|#|,/\/''/'_/\\_/'/''/'/#'#|\'-'/\'--\/\/\|_/-\|/\#'\/'|\''|/#'-'/\/\.|'/'/' |#
|#||'||\/\//'\/''-'\\\/\-\/'#\\#\/'#|/'/\/'\\//'\/'\/'#\/'#|#'\#\\/''\/\\/',.|#
|#|/\/'/\/-\/\'/'\_/'\||\/'#-\\|\|/#'\'-'''`\/\/'\|||//\|/\\#\/\|\'/\/#\#''/'|#
|#|##|\|#'\/'/\\\/\\/\\/\\#\#\|\/'\\|/\'/\\_/'#\##'/\#|#'\#-\#|\|#'\####|\#|||#
|#|\''#'\\#\|##\#\#-\/|\#'\|##\#|/#\\##\##/\#/'#\\#''\\#\#'\#\'\\#\/\/-\\#'\||#
|#|/#|/'\#\/\#\#\#|\/-'#\|#|\#-''##\|\#|\\|-'\#\\#''\/'##'\'\/'#'#\/''\/''\/'|#
|#|\''\\/'||/'-\|'\#'##\#\#|\''\|\'#|#\'#/'\##|#-''\/\##'|###'/\#'#|\/#\/\#' |#
|#|#'|/''|'\/\##'--'\/'-'--'#'##'/#-'\#\-\#|##|\\/'#'--'#'\#|#'\\\/'\/\/'\'' |#
|#\#|\|/'`'\\/'''\|\#'/\|\/\|\#'\'\|/''-'-'|\-'/-'\|\/#''|#-'/\/'-'/-'-''-',_/#
|###\/\#\__/#\___/\/\\\/\#\#\##\/\/\\_/##\#\#\\\\\/\/#\\/\#\#\/\__/\/\_____/###
`-\##########################################################################/-
  `--------------------------------------------------------------------------'



作者自身によるデモ動画。

図:作者によるデモ動画(引用元:https://www.youtube.com/watch?v=QMYfkOtYYlg

解説

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!“とツイートしたとのこと。