aboutsummaryrefslogtreecommitdiff
path: root/src/2019/day5/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-11 11:32:08 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-11 11:32:08 +0800
commit65006ba92d528ad4091adab688808f99e5681d27 (patch)
treedcaf79cad292c5e331c765dbab37b5e6180f63a2 /src/2019/day5/aoc.cpp
parent4a1e85f964a4079f138b52b5e55b97dfb426b7e5 (diff)
downloadadvent-of-code-65006ba92d528ad4091adab688808f99e5681d27.tar.gz
advent-of-code-65006ba92d528ad4091adab688808f99e5681d27.zip
2019 day5 part1
Diffstat (limited to 'src/2019/day5/aoc.cpp')
-rw-r--r--src/2019/day5/aoc.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/2019/day5/aoc.cpp b/src/2019/day5/aoc.cpp
index f0cbc1b..4c310e1 100644
--- a/src/2019/day5/aoc.cpp
+++ b/src/2019/day5/aoc.cpp
@@ -1,5 +1,97 @@
#include "aoc.h"
+#include <vector>
namespace aoc2019 {
+static int input = 1;
+static std::vector<int> outputs = {};
+
+void get_number(const char** pp, int* d) {
+ const char* p = *pp;
+ int sign = 1;
+ if (*p == '-') {
+ sign = -1;
+ p++;
+ }
+ while (*p >= '0' && *p <= '9') {
+ *d = *d * 10 + *p - '0';
+ p++;
+ }
+ *d *= sign;
+ *pp = p;
+}
+
+static 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 101:
+ codes[codes[i + 3]] = codes[i + 1] + codes[codes[i + 2]];
+ run(i + 4, codes);
+ break;
+ case 1001:
+ codes[codes[i + 3]] = codes[codes[i + 1]] + codes[i + 2];
+ run(i + 4, codes);
+ break;
+ case 1101:
+ codes[codes[i + 3]] = codes[i + 1] + 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 102:
+ codes[codes[i + 3]] = codes[i + 1] * codes[codes[i + 2]];
+ run(i + 4, codes);
+ break;
+ case 1002:
+ codes[codes[i + 3]] = codes[codes[i + 1]] * codes[i + 2];
+ run(i + 4, codes);
+ break;
+ case 1102:
+ codes[codes[i + 3]] = codes[i + 1] * codes[i + 2];
+ run(i + 4, codes);
+ break;
+ case 3:
+ codes[codes[i + 1]] = input;
+ run(i + 2, codes);
+ break;
+ case 4:
+ // printf("%d\n", codes[codes[i + 1]]);
+ outputs.push_back(codes[codes[i + 1]]);
+ run(i + 2, codes);
+ break;
+ case 104:
+ // printf("%d\n", codes[i + 1]);
+ outputs.push_back(codes[i + 1]);
+ run(i + 2, codes);
+ break;
+ case 99:
+ break;
+ default:
+ printf("UNKNOWN CODE %d at %zu\n", codes[i], i);
+ break;
+ }
}
+
+int day5(line_view file) {
+ const char* p = file.line;
+ std::vector<int> optcodes;
+ while (p < file.line + file.length) {
+ if ((*p >= '0' && *p <= '9') || *p == '-') {
+ int d{0};
+ get_number(&p, &d);
+ optcodes.push_back(d);
+ }
+ p++;
+ }
+ input = 1;
+ run(0, optcodes);
+ return outputs[outputs.size() - 1];
+}
+
+} // namespace aoc2019