aboutsummaryrefslogtreecommitdiff
path: root/src/2019/day2/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2019/day2/aoc.cpp')
-rw-r--r--src/2019/day2/aoc.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/2019/day2/aoc.cpp b/src/2019/day2/aoc.cpp
index f0cbc1b..7707191 100644
--- a/src/2019/day2/aoc.cpp
+++ b/src/2019/day2/aoc.cpp
@@ -1,5 +1,51 @@
#include "aoc.h"
+#include <vector>
namespace aoc2019 {
+int get_number(const char** pp) {
+ const char* p = *pp;
+ int d{0};
+ while (*p >= '0' && *p <= '9') {
+ d = d * 10 + *p - '0';
+ p++;
+ }
+ *pp = p;
+ return d;
}
+
+void run(size_t i, std::vector<int>& codes) {
+ // printf("execute %d at %zu\n", codes[i], i);
+ switch (codes[i]) {
+ case 1:
+ codes[codes[i + 3]] = codes[codes[i + 1]] + codes[codes[i + 2]];
+ run(i + 4, codes);
+ break;
+ case 2:
+ codes[codes[i + 3]] = codes[codes[i + 1]] * codes[codes[i + 2]];
+ run(i + 4, codes);
+ break;
+ case 99:
+ break;
+ default:
+ printf("UNKNOWN CODE %d at %zu\n", codes[i], i);
+ break;
+ }
+}
+
+int day2(line_view file) {
+ std::vector<int> optcodes;
+ const char* p = file.line;
+ while (p < file.line + file.length) {
+ if (*p >= '0' && *p <= '9') {
+ optcodes.emplace_back(get_number(&p));
+ }
+ p++;
+ }
+ optcodes[1] = 12;
+ optcodes[2] = 2;
+ run(0, optcodes);
+ return optcodes[0];
+}
+
+} // namespace aoc2019