aboutsummaryrefslogtreecommitdiff
path: root/2024/17/day17a.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2024/17/day17a.cpp')
-rw-r--r--2024/17/day17a.cpp82
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>
12using namespace std;
13
14class CPU {
15public:
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 }
59private:
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
71int 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}

Generated with cgit - Back to sebastiano.tronto.net