diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-12-10 12:33:14 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-12-10 12:33:14 +0800 |
commit | 5c7e66af79b30151964ed1469dc4bc83a8bf0043 (patch) | |
tree | 20ae337b32b8ec9a1320a597f6bb0213b9309089 /src/2015/day23/aoc.cpp | |
parent | d8f57bde178cce028e328f343f13dfe216494561 (diff) | |
download | advent-of-code-5c7e66af79b30151964ed1469dc4bc83a8bf0043.tar.gz advent-of-code-5c7e66af79b30151964ed1469dc4bc83a8bf0043.zip |
2015 day23
Diffstat (limited to 'src/2015/day23/aoc.cpp')
-rw-r--r-- | src/2015/day23/aoc.cpp | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/src/2015/day23/aoc.cpp b/src/2015/day23/aoc.cpp index 9cb0cef..fd64a06 100644 --- a/src/2015/day23/aoc.cpp +++ b/src/2015/day23/aoc.cpp @@ -1,11 +1,104 @@ #include "aoc.h" #include <string.h> #include <vector> +#include <functional> namespace aoc2015 { +static int registers[2] = {0}; + +void execute(size_t i, const std::vector<line_view>& is); +void hlf(size_t i, const std::vector<line_view>& 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<line_view>& 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<line_view>& 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<line_view>& is, const char *p) { + int d = get_number(p); + execute(i+d, is); +} + +void jie(size_t i, const std::vector<line_view>& 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<line_view>& 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<line_view>& is) { + if (i >= is.size()) { + return; + } + line_view cmd = is[i]; + const char* p = cmd.line; + struct { + const char* ins; + std::function<void(size_t, const std::vector<line_view>&, 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<int, int> day23(line_view file) { - return {0, 0}; + std::vector<line_view> 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}; } } |