#include "3341-simulator.cpp" struct automat { VAR(t, 0, 1); // odpalovací tlačítko VAR(x, 0, 3); // role: 1=počátek, 2=okraj, 3=střed intervalu, 0=ostatní VAR(y, 0, 1); // výstřel VAR(a, 0, 4); // signál A: kolik taktů zbývá do předání dál VAR(aa, 0, 4); // signál A' VAR(b, 0, 4); // signál B VAR(c, 0, 4); // signál C VAR(cc, 0, 4); // signál C' VAR(d, 0, 4); // signál D automat *L, *P; // sousední automaty automat() { x = y = a = aa = b = 0; L = P = NULL; } void vypis() { printf("t=%d x=%d y=%d a=%d aa=%d b=%d c=%d cc=%d d=%d", t, x, y, a, aa, b, c, cc, d); } void krok() { // Informaci o tlačítku šíříme doleva if (P && P->t == 1) t = 1; // Až se o tom dozví nejlevější, spustí algoritmus. if (!L && x == 0 && t == 1) { x = 1; return; } // Pokud jsem začátek intervalu a všichni mí sousedé také, odpálíme ohňostroj a ukončíme algoritmus. // To také ošetří triviální vstupy. if (x == 1 && (!L || L->x == 1) && (!P || P->x == 1)) { y = 1; x = 0; t = 0; return; } // Na počátku vyšleme signály C a D. if (x == 1) { x = 2; d = 3; } if (L && L->x == 1) c = 2; // Signál C putuje vpravo rychlostí 1, pak se odrazí jako C'. if (c > 0) c--; if (L && L->c == 1) c = 1; if (x == 2 && c > 0) { c = 0; cc = 2; } if (!P && c > 0) { // Výjimka: za pravým okrajem řady si představujeme ještě okraj intervalu. c = 0; cc = 4; } // Signál C' putuje vlevo rychlostí 1. if (cc > 0) cc--; if (P && P->cc == 1) cc = 1; // Signál D putuje vpravo rychlostí 1/3. if (d > 0) d--; if (L && L->d == 1) d = 3; // Když se C' a D potkají, máme střed. Vyšleme z něj A a B. if (x == 0 && cc > 0 && d > 0) { cc = 0; d = 0; x = 3; a = 2; b = 3; } // Signál A putuje vlevo rychlostí 1, tam se odrazí a je z něj A'. if (a > 0) a--; if (P && P->a == 1) a = 1; if (x == 2 && a > 0) { a = 0; aa = 2; } // Signál A' putuje vpravo rychlostí 1. if (aa > 0) aa--; if (L && L->aa == 1) aa = 1; // Signál B putuje vlevo rychlostí 1/2. if (b > 0) b--; if (P && P->b == 1) b = 2; // Když A' doputuje zpět do středu a B doleva, spustíme se znovu v obou polovinách. if (x == 2 && b > 0) { b = 0; x = 1; } if (x == 3 && aa > 0) { aa = 0; x = 1; } } }; struct pokus : simulator { pokus(int N) : simulator(N) { } void ovladani() { if (cas == 0) { automaty[3].t = 1; } } }; int main() { pokus p(16); p.simuluj(100); }