add day 21
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…
Reference in New Issue