diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-04-05 12:19:05 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-04-05 12:19:05 +0800 |
commit | 0742b596f9da460736d64a261312099b3e6483b3 (patch) | |
tree | aeff3ae9aa3e4314bf7973e0c95d6b68f292aa3f /src/2019/day2/aoc.cpp | |
parent | 19663fdfb6c2c61ee6f31c03cfe5277253cfa44e (diff) | |
download | advent-of-code-0742b596f9da460736d64a261312099b3e6483b3.tar.gz advent-of-code-0742b596f9da460736d64a261312099b3e6483b3.zip |
2019 day2 part1
Diffstat (limited to 'src/2019/day2/aoc.cpp')
-rw-r--r-- | src/2019/day2/aoc.cpp | 46 |
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 |