aboutsummaryrefslogtreecommitdiff
path: root/src/2015/day23/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-12-10 12:33:14 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-12-10 12:33:14 +0800
commit5c7e66af79b30151964ed1469dc4bc83a8bf0043 (patch)
tree20ae337b32b8ec9a1320a597f6bb0213b9309089 /src/2015/day23/aoc.cpp
parentd8f57bde178cce028e328f343f13dfe216494561 (diff)
downloadadvent-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.cpp95
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};
}
}