#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

#define t typedef
#define R return
t char c;
t void *v;
t v (*f)(v);
t int q;

c w = 13;
#define S "|          |\n"
c z = 42;
c J = 32;

c *l;
c *o;

#define LA memmove
#define U strcpy
#define _(x) v x(v d)
#define m(n, a, b, c, f) _(n) { v *e = d; a p = e[0]; b j = e[1]; c g = e[2]; f h = e[3];

v i(q p, f a, f b, v c)
{
    f q[] = {a, b};
    R q[!p](c);
}

_(n) { R 0; }

m(x, f, v, f, v)
    
    g(h);
#define FR R i((q)p(j), x, n, d);
    FR
}

v W(f p, v j, f g, v c)
{
    v d[] = { p, j, g, c };
    FR
}

q A;
struct termios B;
v D()
{
#define O(x) tc ## x ## etattr(0,
#define TD O(s) TCSANOW, &B);
#define X B.c_lflag
    O(g) &B);
    A = X;
    X &= ~ICANON & ~ECHO;
    TD
}

v C()
{
    O(g) &B);
    X = A;
    TD
    exit(1);
}

c *E;
c F;

_(G)
{
    R E = strchr(E + 1, F);
}

v H(c *A, c C, f D)
{
    E = A - 1;
    F = C;
    W(G, 0, D, &E);
}

c I;
_(FJ)
{
    **(c **)d = I;
}

v K(c G)
{
    I = G;
    H(o, z, FJ);
}

q L;
_(M)
{
    (*(c **)d - l + o)[L] = z;
}

q N;
_(FO)
{
    c h = (*(c **)d)[L];
    N |= h - z && h - J;
}

_(FP)
{
    K(J);
    H(l, z, M);
    R FP;
}

v Q(q M, q Q)
{
    L = M + Q * w;
    N = 0;
    H(l, z, FO);
    R i(N, n, FP, 0);
}

_(AR)
{
    R *(c **)d = strstr(o, "|##########");
}

_(FS)
{
    LA(o + w, o, *(c **)d - o);
    memcpy(o, S, strlen(S));
}

_(T)
{
    K(35);
    E = o;
    W(AR, &E, FS, &E);
}

q V, Z, y, u[4], k[4];
_(FU)
{
    q e = *(c **)d - l;
    u[y] = e % w;
    k[y] = e / w;
    V += e % w;
    Z += e / w;
    y++;
}

_(FV)
{
    R (v)(y--);
}

_(FX)
{
    U(o, l);
    y = 0;
}

_(FY)
{
    *(c *)d = z;
}

_(FZ)
{
    c *s = o + V + k[y] - Z + (Z + V - u[y] + 1) * w;
    i(s < o | *s - J, FX, FY, s);
}

_(AA)
{
    V = Z = y = 0;
    H(l, z, FU);
    K(J);
    V /= y;
    Z /= y;
    W(FV, 0, FZ, 0);
}

_(BB)
{
    i(!strchr(l, z), n, AA, 0);
}

m(CC, q *, c *, f, q *)
    
    j[*h] = z;
    (*p)--;
}

m(DD, c *, c *, q *, q *)
    
    *h = rand() % (*g - 1) + 1;
    i(j[*h] == J & (j[*h - 1] == z | j[*h + 1] == z | (*h > w & j[*h - w] == z)), CC, n, d);
}

_(EE)
{
    R (v)*(q *)d;
}

_(GG)
{
    *(c *)d = z;
}

c *HH;
_(II)
{
    q j = *(c **)d - HH;
    i(l[j] - J, C, GG, o + j);
}

_(UU)
{
    q i = 3;
    c p[] = S S S S;
    p[5] = z;
    
    q j = 53;
    q g;
    
    v h[] = { &i, p, &j, &g };
    W(EE, &i, DD, h);
    HH = p;
    H(p, z, II);
}

_(JJ)
{
    i(!strchr(l, z), UU, n, 0);
}

m(KK, f, f, q *, f)

    i(*g, BB, JJ, d);
}

m(LL, q *, q *, f, f)

    *p = (*p + 1) % 10;
    d = Q(*j, !*p);
    
    i(!*p & !*j & !d, T, KK, e);
}

_(MM)
{
    v p = Q(0, 1);
    i(!p, T, n, 0);
    U(l, o);
    R p;
}

_(NN)
{
    W(MM, 0, n, 0);
}

_(RR)
{
    l = malloc(261);
    I = strlen(S);
    U(l, S);
    strcat(l, S);
#define Y(x) LA(l + I * x, l, I * x + 1);
    Y(2)
    o = strdup(l);
    Y(4)
    Y(8)
    strcat(l, o);
    
    D();
}

q P = 0;
m(TT, f, c *, c *, c *)
    l = strdup(j);
    A = atoi(g);
    P = atoi(h);
}

q main(q p, c **j)
{
    usleep(30000);
    i(p - 4, RR, TT, j);
    o = strdup(l);
    srand(time(0));
    
    q L = 0, F = 0, I = 0;
    v e[] = { &P, &L, &F, &I } ;
    
    c s = 0;
    fcntl(0, F_SETFL, O_NONBLOCK);
    read(0, &s, 1);

#define r(x, z, k) z = (s == x) * k + (s != x) * z
    r(52, L, -1);
    r(54, L, 1);
    r(53, F, 1);
    r(50, P, 9);
    r(J, I, 9);
    i(s - 'q', n, C, 0);
    
    U(o, l);
    i(I, NN, LL, e);
    
    U(l, o);
    puts(l);
    
    E = o + sprintf(o, "%d", A) + 1;
    sprintf(E, "%d", P);
    execlp(j[0], j[0], l, o, E, NULL);
}
