make
NOTE: this program requires the tool tcpserver
to use. If you do not have this
program see FAQ 3.14 - How do I compile and install tcpserver for entries that
require it.
tcpserver -v 127.0.0.1 10333 ./prog ioccc.txt
Then connect to http://localhost:10333 with your browser.
How did the leopard get its spots? Why are a zebra’s stripes unique?
In case you didn’t recognise the portrait of Alan
Turing, there are some
pointers to his features like eyes with “stdeye-o
” and “<--mouth
”. Can you
find any other tributes?
What does “Alan Turing” remind you of? Cryptanalysis of the Enigma machine? Turing machine? Turing test? This program is also based on his work.
Compile the program as follows:
cc -O3 -std=c99 \
-Wall -Wextra -pedantic -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
Then, run it with the tcpserver
command in the
ucspi-tcp package, which was created by
Daniel J. Bernstein’s
1991/brndstd “Best of Show”.
tcpserver -v 127.0.0.1 10333 ./prog ioccc.txt
Finally, open http://127.0.0.1:10333/
in a modern browser supporting HTML5.
You can use the mouse cursor to place drops into the Petri
dish interactively.
This is a simulator of reaction-diffusion systems.
Reaction-diffusion systems, proposed by Alan Turing in 1, are mathematical models in which two chemical substances are transformed into each other (local chemical reactions) and spread out (diffusion). Their interactions sometimes form non-trivial patterns, such as spots, spiral, dappling, and labyrinths.
The systems are generally formulated as follows:
du/dt = F(u, v) + Du * laplacian(u)
dv/dt = G(u, v) + Dv * laplacian(v)
The functions F(u, v)
and G(u, v)
represent reactions of each substance, and
the parameters Du
and Dv
are diffusion coefficients. By changing the
functions and parameters, you can see a wide range of behaviors.
See the Wikipedia article of “Reaction-diffusion system” in detail.
This program simulates the systems. The field consists of 128 x 128 cells. Each cell includes information of an amount of the two substances, and interacts with neighbor cells (in terms of von Neumann neighborhood) in each frame.
You can change the model, initial pattern, simulation speed, and color via macro definition.
-Delta_u=<expression> -Delta_v=<expression>
The definitions represent the equations of reaction-diffusion system. For example, the following is the Gray-Scott model in TeX notation.
\frac{\partial u}{\partial t} = D_u \Delta u - u v^2 + F (1 - u)
\frac{\partial v}{\partial t} = D_v \Delta v + u v^2 - v (F + K)
You can specify this model as follows:
-Delta_u="Du*laplacian(u)-u*v*v+F*(1-u)" \
-Delta_v="Dv*laplacian(v)+u*v*v-v*(F+K)"
Du
, Dv
, F
, and K
are parameters of that model.
-DUV_BACKGROUND=<u0>,<v0> -DUV_DROP=<u1>,<v1>
The definitions specifies the initial amount of the two substances u
and v
.
All cells have (u0, v0)
by default.
You can specify a pattern file when the executable is invoked (not
compile-time). The file should include a sequence of points, see
ioccc.txt, center.txt, or line.txt as
examples. Each amount in cells near to the point included in the file, will be
added by (u1, v1)
.
-DTIMESTEP=ts -DSPEED=spd
The definitions are for changing the simulation speed.
TIMESTEP
is a simulation time step. The bigger, the faster but more unstable.
SPEED
is a frame skip parameter. The bigger, the faster but more sluggish.
-DRGB=r:g:b
This specifies a color used for rendering.
Some interesting parameters are included in Makefile
. Do one of the following
commands and open http://127.0.0.1:10333
.
make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 ioccc.txt
make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 center.txt
make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 line.txt
make gray-scott-2 && tcpserver -v 127.0.0.1 10333 ./gray-scott-2 ioccc.txt
make gray-scott-3 && tcpserver -v 127.0.0.1 10333 ./gray-scott-3 ioccc.txt
make gray-scott-4 && tcpserver -v 127.0.0.1 10333 ./gray-scott-4 ioccc.txt
make fitzhugh-nagumo-1 && tcpserver -v 127.0.0.1 10333 ./fitzhugh-nagumo-1 ioccc.txt
make fitzhugh-nagumo-2 && tcpserver -v 127.0.0.1 10333 ./fitzhugh-nagumo-2 ioccc.txt
make oregonator && tcpserver -v 127.0.0.1 10333 ./oregonator ioccc.txt
These examples are created by drawing (and modifying) the pattern files of Ready, a cross-platform implementation of various reaction-diffusion systems 2.
This program compiles clean with no warnings under -std=c99 -Wall -Wextra -pedantic
. Since it uses long long
for 64bit integers, C99 is required.
You must use a modern browser that supports the latest specification of WebSocket 3. All the following browsers worked for me:
I think Safari 6 will work but I haven’t tested. (I have no recent macOS.)
NOTE from the judges in 2023: recent versions of Safari also work.
I think you may use inetd
and xinetd
instead of tcpserver
. Here is an
example inetd
configuration.
10333 stream tcp nowait nobody /path/to/prog /path/to/prog /path/to/initial-pattern.txt
But note that I didn’t test well.
Turing, A. M., “The Chemical Basis of Morphogenesis”, Philosophical Transactions of the Royal Society, 1952.↩︎
The Ready Bunch, “Ready”, A cross-platform implementation of various reaction-diffusion systems, since 2011, https://github.com/GollyGang/ready.↩︎
Fette, I. and A. Melnikov, “The WebSocket Protocol”, RFC 6455, DOI 10.17487/RFC6455, December 2011, http://www.rfc-editor.org/info/rfc6455.↩︎
Eastlake 3rd, D. and P. Jones, “US Secure Hash Algorithm 1 (SHA1)”, RFC 3174, DOI 10.17487/RFC3174, September 2001, http://www.rfc-editor.org/info/rfc3174.↩︎
Josefsson, S., “The Base16, Base32, and Base64 Data Encodings”, RFC 4648, DOI 10.17487/RFC4648, October 2006, http://www.rfc-editor.org/info/rfc4648.↩︎