dos33fsprogs/gr-sim/fluid/water.c
2019-07-25 09:16:23 -04:00

40 lines
1.4 KiB
C

// Based on Fluid_Sim
// an IOCCC 2012 winner
// by Yusuke Endoh
#define G 1 // gravity
#define P 4 // pressure
#define V 8 // viscosity
#include <stdio.h>// .IOCCC Fluid- #
#include <unistd.h> //2012 _Sim!_ #
#include <complex.h> //|||| ,____. IOCCC- #
double complex a[97687], *p, *q, *r = a, w = 0, d;
int x , y;
char b [6856] = "\x1b[2J" "\x1b" "[1;1H ", *o = b, *t;
int main(
) {
for (; 0 < (x = getc(stdin));)
w = x > 10 ? 32 < x ? 4[*r++ = w, r] = w + 1, *r = r[5] = x == 35, r += 9 : 0, w - I : (x = w + 2);;
for (;; puts(o), o = b + 4) {
for (p = a; p[2] = p[1] * 9, p < r; p += 5)
for (q = a; w = cabs(d = *p - *q) / 2 - 1, q < r; q += 5)
if (0 < (x = 1 - w))
p[2] += w * w;
for (p = a; p[3] = G, p < r; p += 5)
for (q = a; w = cabs(d = *p - *q) / 2 - 1, q < r; q += 5)
if (0 < (x = 1 - w))
p[3] += w * (d * (3 - p[2] - q[2]) * P + p[4] * V - q[4] * V) / p[2];
for (x = 011; 2012 - 1 > x++;)
b[x] = 0;
for (p = a; (t = b + 10 + (x = *p * I) + 80 * (y = *p / 2), *p += p[4] += p[3] / 10 * !p[1]), p < r; p += 5)
x = 0 <= x && x < 79 && 0 <= y && y < 23 ? 1[1[*t |= 8, t] |= 4, t += 80] = 1, *t |= 2 : 0;
for (x = 011; 2012 - 1 > x++;)
b[x] = " '`-.|//,\\" "|\\_" "\\/\x23\n"[x % 80 - 9 ? x[b] : 16];;
usleep(12321);
} return 0;
}