#include "aoc.h" #include #include #include namespace aoc2015 { static int registers[2] = {0}; void execute(size_t i, const std::vector& is); void hlf(size_t i, const std::vector& is, const char *p) { int x = *p == 'a' ? 0 : 1; registers[x] /= 2; execute(i+1, is); } void tpl(size_t i, const std::vector& is, const char *p) { int x = *p == 'a' ? 0 : 1; registers[x] *= 3; execute(i+1, is); } void inc(size_t i, const std::vector& is, const char *p) { int x = *p == 'a' ? 0 : 1; registers[x] += 1; execute(i+1, is); } static int get_number(const char *p) { int sign = *p == '+' ? 1 : -1; p++; int d{0}; while(*p <= '9' && *p >= '0') { d = 10 * d + *p - '0'; p++; } d *= sign; return d; } void jmp(size_t i, const std::vector& is, const char *p) { int d = get_number(p); execute(i+d, is); } void jie(size_t i, const std::vector& is, const char *p) { int x = *p == 'a' ? 0 : 1; p += 3; int d = registers[x] % 2 == 0 ? get_number(p) : 1; execute(i+d, is); } void jio(size_t i, const std::vector& is, const char *p) { int x = *p == 'a' ? 0 : 1; p += 3; int d = registers[x] == 1 ? get_number(p) : 1; execute(i+d, is); } void execute(size_t i, const std::vector& is) { if (i >= is.size()) { return; } line_view cmd = is[i]; const char* p = cmd.line; struct { const char* ins; std::function&, const char*)> f; } cmds[] = { {"hlf", hlf}, {"tpl", tpl}, {"inc", inc}, {"jmp", jmp}, {"jie", jie}, {"jio", jio}, }; for(auto& c : cmds) { if (strncmp(p, c.ins, 3) == 0) { c.f(i, is, p+4); break; } } } std::pair day23(line_view file) { std::vector is; per_line(file, [&is](line_view lv){ is.push_back(lv); return true; }); execute(0, is); int a1 = registers[1]; registers[0] = 1; registers[1] = 0; execute(0, is); int a2 = registers[1]; return {a1, a2}; } }