Most Diffused Reaction

もっとも拡散した反応

受賞者:Someone Anonymous and Yusuke Endoh

引用元:https://www.ioccc.org/2015/endoh1/prog.c

審査員・作者による説明:https://www.ioccc.org/2015/endoh1/hint.html

動作

反応拡散系のシミュレータ。

コンパイル方法が難しい。 たとえば次のようにビルドする。

$ gcc -o prog prog.c \
    -Delta_u="Du*laplacian(u)-u*v*v+F*(1-u)" \
    -Delta_v="Dv*laplacian(v)+u*v*v-v*(F+K)" \
    -DF=0.040 -DK=0.060 -DDu=0.200 -DDv=0.100 \
    -DUV_BACKGROUND=1,0 -DUV_DROP=-0.5,0.5 \
    -DTIMESTEP=1.0 -DSPEED=2 -DRGB=255:128:192

そして、ucspi-tcpのtcpserverコマンドを使って次のように起動する。

$ tcpserver -v 127.0.0.1 10333 ./prog ioccc.txt

ブラウザでhttp://localhost:10333を開くと、IOCCCと書かれた画面がじわっと変化していく。

ブラウザの画面(起動直後)
図:ブラウザの画面(起動直後)
ブラウザの画面(変化していく)
図:ブラウザの画面(変化していく)
ブラウザの画面(安定した様子)
図:ブラウザの画面(安定した様子)

マウスカーソルをブラウザの画面の上で動かすことでかき混ぜることができる。

他にもコンパイルオプションでいろいろな挙動をさせられる。

make gray-scott-2の様子
図:make gray-scott-2の様子
make oregonatorの様子
図:make oregonatorの様子

詳しくはhint.textを参照のこと。

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

解説

反応拡散系は、何種類かの化学物質がお互いに反応しつつ、全体に拡散していくという様子を表現する数理モデル。 身近なところでは、豹やシマウマなどの柄は反応拡散系でモデル化できるとされている。

このプログラムは、128 x 128のマスのあるフィールドで、2種類の化学物質の量をシミュレーションする。 各マスの中で物質が化学反応したり、隣接するマスから流入または流出することで、単位時間ごとに物質の量が増減していく。

ブラウザをUIとして利用する点が新しい。 WebSocketcanvas要素を使っている。 このプログラムは、サーバとしてブラウザからのリクエストを待ち受け、JavaScriptやCanvas要素を含んだhtmlを返す。 ブラウザはそれを見て接続をWebSocketにアップグレードすることを要求するのでそれに応える。 WebSocketに反応拡散系のシミュレーション結果を流し、ブラウザ側はそれをCanvasに表示し続ける。 また、ブラウザ側のマウスイベントはWebSocket経由でプログラムに通知し、シミュレーションに影響を与える。

TCPの待受自体はtcpserverにまかせるが、HTTPリクエストの処理、WebSocketのアップグレード対応は自力で行っている。 WebSocketにはSHA1計算やBase64エンコーディングが必要で、これらもprog.cの中で実装されている。

コードの形状はアラン・チューリングの肖像画。 チューリングと言えばエニグマの暗号解読、チューリング機械チューリングテストなど多数の業績で知られるが、反応拡散系の提唱もチューリングの業績の1つ。 コードには絵画らしく、最下行にAlan Turing (1912--1954)と書いてある。 一方で、コメントでいろいろ落書きをしている。 口のあたりにhahaha<--mouthなど。

賞名は[[2015/yang]]と対称的になっている。