aboutsummaryrefslogtreecommitdiffstats
path: root/day21/part1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'day21/part1.cpp')
-rw-r--r--day21/part1.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/day21/part1.cpp b/day21/part1.cpp
new file mode 100644
index 0000000..5698c82
--- /dev/null
+++ b/day21/part1.cpp
@@ -0,0 +1,83 @@
+#include <cctype>
+#include <iostream>
+#include <map>
+#include <string>
+#include <vector>
+
+struct Node
+{
+ std::string left;
+ std::string right;
+ char op = 0;
+ long long n = 0;
+
+ bool solved() const { return left.empty(); }
+
+ bool solve(const auto& tree) {
+ const auto& ln = tree.at(left);
+ const auto& rn = tree.at(right);
+
+ if (ln.solved() && rn.solved()) {
+ switch (op) {
+ case '+':
+ n = ln.n + rn.n;
+ break;
+ case '-':
+ n = ln.n - rn.n;
+ break;
+ case '*':
+ n = ln.n * rn.n;
+ break;
+ case '/':
+ n = ln.n / rn.n;
+ break;
+ }
+
+ left.clear();
+ }
+
+ return solved();
+ }
+};
+
+int main()
+{
+ std::map<std::string, Node> tree;
+
+ while (!std::cin.eof()) {
+ std::string line;
+ std::getline(std::cin, line);
+ if (std::cin.eof())
+ break;
+
+ auto split = line.find(':');
+ const auto key = line.substr(0, split);
+ line = line.substr(split + 2);
+
+ Node node;
+ if (isdigit(line.front())) {
+ node.n = std::stoll(line);
+ } else {
+ split = line.find(' ');
+ node.left = line.substr(0, split);
+ node.op = line.at(split + 1);
+ node.right = line.substr(split + 3, 4);
+ }
+
+ tree.emplace(key, node);
+ }
+
+ bool more = true;
+ while (more) {
+ more = false;
+ for (auto& [k, v] : tree) {
+ if (!v.solved())
+ more |= !v.solve(tree);
+ }
+ }
+
+ std::cout << "root: " << tree["root"].n << std::endl;
+
+ return 0;
+}
+