引用元: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と書かれた画面がじわっと変化していく。
マウスカーソルをブラウザの画面の上で動かすことでかき混ぜることができる。
他にもコンパイルオプションでいろいろな挙動をさせられる。
詳しくはhint.textを参照のこと。
解説
反応拡散系は、何種類かの化学物質がお互いに反応しつつ、全体に拡散していくという様子を表現する数理モデル。
身近なところでは、豹やシマウマなどの柄は反応拡散系でモデル化できるとされている。
このプログラムは、128 x 128のマスのあるフィールドで、2種類の化学物質の量をシミュレーションする。
各マスの中で物質が化学反応したり、隣接するマスから流入または流出することで、単位時間ごとに物質の量が増減していく。
ブラウザをUIとして利用する点が新しい。
WebSocketとcanvas要素を使っている。
このプログラムは、サーバとしてブラウザからのリクエストを待ち受け、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]]と対称的になっている。