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\20a.txt" />
|
||||||
<EmbeddedResource Include="inputs\21.txt" />
|
<EmbeddedResource Include="inputs\21.txt" />
|
||||||
<None Remove="inputs\22.txt" />
|
<None Remove="inputs\22.txt" />
|
||||||
|
<EmbeddedResource Include="inputs\21a.txt" />
|
||||||
<EmbeddedResource Include="inputs\22.txt" />
|
<EmbeddedResource Include="inputs\22.txt" />
|
||||||
<None Remove="inputs\23.txt" />
|
<None Remove="inputs\23.txt" />
|
||||||
<EmbeddedResource Include="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