#include #include #define OC 0 #define OPS \ OP(addr) OP(addi) OP(mulr) OP(muli) \ OP(banr) OP(bani) OP(borr) OP(bori) \ OP(setr) OP(seti) OP(gtir) OP(gtri) \ OP(gtrr) OP(eqir) OP(eqri) OP(eqrr) #define OP(name) name, enum ops {OPS num_ops}; #undef OP #define OP(name) #name, static char *opnames[] = {OPS}; #undef OP union register_file { uint32_t all; uint8_t r[4]; }; static inline union register_file execute(int op, int a, int b, int c, union register_file f) { switch (op) { case addr: f.r[c] = f.r[a] + f.r[b]; break; case addi: f.r[c] = f.r[a] + b; break; case mulr: f.r[c] = f.r[a] * f.r[b]; break; case muli: f.r[c] = f.r[a] * b; break; case banr: f.r[c] = f.r[a] & f.r[b]; break; case bani: f.r[c] = f.r[a] & b; break; case borr: f.r[c] = f.r[a] | f.r[b]; break; case bori: f.r[c] = f.r[a] | b; break; case setr: f.r[c] = f.r[a]; break; case seti: f.r[c] = a; break; case gtir: f.r[c] = a > f.r[b]; break; case gtri: f.r[c] = f.r[a] > b; break; case gtrr: f.r[c] = f.r[a] > f.r[b]; break; case eqir: f.r[c] = a == f.r[b]; break; case eqri: f.r[c] = f.r[a] == b; break; case eqrr: f.r[c] = f.r[a] == f.r[b]; break; default: ; } return f; } #define IO_ERROR 1; int main(int argc, char *argv[]) { int match3_count = 0; FILE *input; int error = IO_ERROR; if (input = fopen(argc > 1? argv[1]: "input.txt", "r")) { int i, j, k, l, m, n, o, p, q, r, s, t; error = 0; while (fscanf(input, "Before: [%d, %d, %d, %d] " "%d %d %d %d " "After: [%d, %d, %d, %d] ", &i, &j, &k, &l, &m, &n, &o, &p, &q, &r, &s, &t) == 12 ) { union register_file b, a; int matches = 0; b.r[0] = i; b.r[1] = j; b.r[2] = k; b.r[3] = l; a.r[0] = q; a.r[1] = r; a.r[2] = s; a.r[3] = t; if (OC) printf( "Before: [%d, %d, %d, %d]\n" "After: [%d, %d, %d, %d]\n", i, j, k, l, q, r, s, t ); for (int op = 0; op < num_ops; op++) { union register_file d = execute(op, n, o, p, b); if (d.all == a.all) matches++; if (OC) printf( "%s %d %d %d: [%d, %d, %d, %d] (%d)\n", opnames[op], n, o, p, d.r[0], d.r[1], d.r[2], d.r[3], matches ); } if (matches >= 3) { match3_count++; if (OC) printf("Triple matches: %d\n", match3_count); } if (OC) putchar('\n'); } fclose(input); } if (error) return error; printf("%d\n", match3_count); return 0; }