mirror of
https://github.com/parnic/advent-of-code-2022.git
synced 2025-06-16 13:40:13 -05:00
Day 21 answer
Inverting the operations gave me some trouble, but I made it.
This commit is contained in:
@ -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" />
|
||||
|
1621
inputs/21.txt
1621
inputs/21.txt
File diff suppressed because it is too large
Load Diff
15
inputs/21a.txt
Normal file
15
inputs/21a.txt
Normal 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
109
src/21.cs
Normal 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}";
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user