From 477ed667b1a9bc7f73850f45449666a8907ecaed Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Wed, 20 Dec 2023 16:32:41 +0100 Subject: Added solution for 20 --- 2023/20/20a.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 2023/20/20a.c (limited to '2023/20/20a.c') diff --git a/2023/20/20a.c b/2023/20/20a.c new file mode 100644 index 0000000..99b6874 --- /dev/null +++ b/2023/20/20a.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include + +#define N 100 +#define ischar(c) (c >= 'a' && c <= 'z') + +typedef struct { + int nin, nout, in[N], out[N]; + char name[20], outc[N][20]; + bool isff, ison, reg[N]; +} node_t; + +typedef struct { + int i, n, node[1000]; + bool hi[1000]; +} queue_t; + +char *buf, line[N][N]; +int b, n; +int64_t hitot, lowtot; +node_t m[N]; + +void add(queue_t *q, int v, bool hi) { + q->node[q->n] = v; + q->hi[q->n] = hi; + q->n++; +} + +void send(queue_t *q, int v, bool hi) { + for (int j = 0; j < m[v].nout; j++) { + add(q, m[v].out[j], hi); + m[m[v].out[j]].reg[v] = hi; + if (hi) hitot++; else lowtot++; + } +} + +void pushbutton(void) { + queue_t q = {0}; + + add(&q, b, false); + lowtot++; + while (q.i < q.n) { + int v = q.node[q.i]; + bool hi = q.hi[q.i]; + q.i++; + + if (v == b) { + send(&q, v, hi); + } else if (m[v].isff) { + if (!hi) + send(&q, v, m[v].ison = !m[v].ison); + } else { + bool allhi = true; + for (int j = 0; j < m[v].nin; j++) + allhi = allhi && m[v].reg[m[v].in[j]]; + send(&q, v, !allhi); + } + } +} + +int main() { + for (n = 0; (buf = fgets(line[n], N, stdin)) != NULL; n++) { + if (ischar(*buf)) b = n; + m[n].isff = *buf == '%'; + if (!ischar(*buf)) buf++; + for (int i = 0; ischar(*buf); m[n].name[i++] = *(buf++)) ; + buf += 4; + for (int i = 0; *buf != '\n'; i++) { + while (!ischar(*buf)) buf++; + for (int j = 0; ischar(*buf); m[n].outc[i][j++] = *(buf++)) ; + } + } + + for (int i = 0; i < n; i++) { + for (int j = 0; m[i].outc[j][0]; j++) { + bool found = false; + for (int k = 0; k < n; k++) { + if (!strcmp(m[k].name, m[i].outc[j])) { + m[i].out[m[i].nout++] = k; + m[k].in[m[k].nin++] = i; + found = true; + } + } + if (!found) { + m[i].out[m[i].nout++] = n; + m[n].in[m[n].nin++] = i; + n++; + } + } + } + + for (int i = 0; i < 1000; i++) + pushbutton(); + + printf("%" PRId64 " (%" PRId64 " low, %" PRId64 " hi)\n", + hitot * lowtot, lowtot, hitot); + return 0; +} -- cgit v1.3