Day 21 answer

Inverting the operations gave me some trouble, but I made it.
This commit is contained in:
2022-12-21 12:21:49 -06:00
parent 52bd9dfc2b
commit e734972170
4 changed files with 1744 additions and 2 deletions

View File

@ -84,6 +84,7 @@
<EmbeddedResource Include="inputs\20a.txt" />
<EmbeddedResource Include="inputs\21.txt" />
<None Remove="inputs\22.txt" />
<EmbeddedResource Include="inputs\21a.txt" />
<EmbeddedResource Include="inputs\22.txt" />
<None Remove="inputs\23.txt" />
<EmbeddedResource Include="inputs\23.txt" />

File diff suppressed because it is too large Load Diff

15
inputs/21a.txt Normal file
View File

@ -0,0 +1,15 @@
root: pppw + sjmn
dbpl: 5
cczh: sllz + lgvd
zczc: 2
ptdq: humn - dvpt
dvpt: 3
lfqf: 4
humn: 5
ljgn: 2
sjmn: drzm * dbpl
sllz: 4
pppw: cczh / lfqf
lgvd: ljgn * ptdq
drzm: hmdt - zczc
hmdt: 32

109
src/21.cs Normal file
View File

@ -0,0 +1,109 @@
namespace aoc2022;
internal class Day21 : Day
{
private record monkeyOp(int num, string m1, string m2, string op);
private readonly Dictionary<string, monkeyOp> monkeys = new();
internal override void Parse()
{
foreach (var line in Util.Parsing.ReadAllLines("21"))
{
var parts = line.Split(": ");
if (parts[1].Contains(" "))
{
var op = parts[1].Split(' ');
monkeys.Add(parts[0], new monkeyOp(0, op[0], op[2], op[1]));
}
else
{
monkeys.Add(parts[0], new monkeyOp(int.Parse(parts[1]), string.Empty, string.Empty, string.Empty));
}
}
}
private long getResultFromMonkey(string monkey)
{
var op = monkeys[monkey];
if (string.IsNullOrEmpty(op.m1))
{
return op.num;
}
var left = getResultFromMonkey(op.m1);
var right = getResultFromMonkey(op.m2);
return op.op switch
{
"+" => left + right,
"-" => left - right,
"*" => left * right,
"/" => left / right,
_ => throw new Exception("unhandled"),
};
}
private long getRequiredHumnResult(string monkey, long? target = null)
{
if (monkey == "humn")
{
return target!.Value;
}
var leftMonkey = monkeys[monkey].m1;
if (string.IsNullOrEmpty(leftMonkey))
{
return monkeys[monkey].num;
}
var rightMonkey = monkeys[monkey].m2;
var left1 = getResultFromMonkey(leftMonkey);
var right1 = getResultFromMonkey(rightMonkey);
monkeys["humn"] = new monkeyOp(monkeys["humn"].num == 0 ? 1000000 : 0, string.Empty, string.Empty, string.Empty);
var left2 = getResultFromMonkey(leftMonkey);
long result;
if (left1 != left2)
{
target = monkeys[monkey].op switch
{
"+" => target - right1,
"-" => target + right1,
"*" => target / right1,
"/" => target * right1,
_ => throw new Exception("unhandled"),
};
result = getRequiredHumnResult(leftMonkey, target ?? right1);
}
else
{
target = monkeys[monkey].op switch
{
"+" => target - left1,
"-" => left1 - target,
"*" => target / left1,
"/" => left1 / target,
_ => throw new Exception("unhandled"),
};
result = getRequiredHumnResult(rightMonkey, target ?? left1);
}
return result;
}
internal override string Part1()
{
var result = getResultFromMonkey("root");
return $"<+white>{result}";
}
internal override string Part2()
{
var result = getRequiredHumnResult("root");
return $"<+white>{result}";
}
}