add day 21

master
Clyne 2 years ago
parent d58977fe0f
commit 43d25346d7

@ -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;
}

@ -0,0 +1,9 @@
## Solving part 2 with Maxima
1. Add '$' to the end of each line of input.
2. Replace `root`'s operator with '='.
3. Replace `humn`'s definition with x: `humn: x$`.
4. Load into maxima: `maxima --init-mac=input`
5. Evaluate `root` until `x` is visible: `root: root, eval;`.
6. Solve: `solve(root, x)`.
Loading…
Cancel
Save