diff options
Diffstat (limited to '2024/17/day17a.cpp')
| -rw-r--r-- | 2024/17/day17a.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/2024/17/day17a.cpp b/2024/17/day17a.cpp new file mode 100644 index 0000000..27f8aed --- /dev/null +++ b/2024/17/day17a.cpp | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | #include <algorithm> | ||
| 2 | #include <cstdint> | ||
| 3 | #include <iostream> | ||
| 4 | #include <map> | ||
| 5 | #include <queue> | ||
| 6 | #include <ranges> | ||
| 7 | #include <set> | ||
| 8 | #include <sstream> | ||
| 9 | #include <string> | ||
| 10 | #include <string_view> | ||
| 11 | #include <vector> | ||
| 12 | using namespace std; | ||
| 13 | |||
| 14 | class CPU { | ||
| 15 | public: | ||
| 16 | CPU(uint64_t a, uint64_t b, uint64_t c) : A{a}, B{b}, C{c} {} | ||
| 17 | |||
| 18 | void process(const vector<uint64_t>& v) { | ||
| 19 | for (unsigned ip = 0; ip < v.size(); ) { | ||
| 20 | switch (v[ip]) { | ||
| 21 | case 0: | ||
| 22 | A >>= combo(v[ip+1]); | ||
| 23 | ip += 2; | ||
| 24 | break; | ||
| 25 | case 1: | ||
| 26 | B ^= v[ip+1]; | ||
| 27 | ip += 2; | ||
| 28 | break; | ||
| 29 | case 2: | ||
| 30 | B = combo(v[ip+1]) % 8; | ||
| 31 | ip += 2; | ||
| 32 | break; | ||
| 33 | case 3: | ||
| 34 | ip = A == 0 ? ip+2 : v[ip+1]; | ||
| 35 | break; | ||
| 36 | case 4: | ||
| 37 | B ^= C; | ||
| 38 | ip += 2; | ||
| 39 | break; | ||
| 40 | case 5: | ||
| 41 | cout << combo(v[ip+1])%8 << ","; | ||
| 42 | ip += 2; | ||
| 43 | break; | ||
| 44 | case 6: | ||
| 45 | B = A >> combo(v[ip+1]); | ||
| 46 | ip += 2; | ||
| 47 | break; | ||
| 48 | case 7: | ||
| 49 | C = A >> combo(v[ip+1]); | ||
| 50 | ip += 2; | ||
| 51 | break; | ||
| 52 | default: | ||
| 53 | cout << "Error! Operator " << v[ip] << endl; | ||
| 54 | exit(1); | ||
| 55 | } | ||
| 56 | } | ||
| 57 | cout << endl; | ||
| 58 | } | ||
| 59 | private: | ||
| 60 | uint64_t A, B, C; | ||
| 61 | |||
| 62 | uint64_t& reg(uint64_t i) { | ||
| 63 | return i == 0 ? A : (i == 1 ? B : C); | ||
| 64 | } | ||
| 65 | |||
| 66 | uint64_t combo(uint64_t i) { | ||
| 67 | return i <= 3 ? i : reg(i-4); | ||
| 68 | } | ||
| 69 | }; | ||
| 70 | |||
| 71 | int main() { | ||
| 72 | uint64_t a, b, c; | ||
| 73 | cin >> a >> b >> c; | ||
| 74 | CPU cpu(a, b, c); | ||
| 75 | |||
| 76 | vector<uint64_t> instructions; | ||
| 77 | while (cin >> a) | ||
| 78 | instructions.push_back(a); | ||
| 79 | |||
| 80 | cpu.process(instructions); | ||
| 81 | return 0; | ||
| 82 | } | ||
