2022-12-03 05:55:49 +00:00
|
|
|
namespace AOC2015;
|
2022-11-11 18:42:42 +00:00
|
|
|
|
|
|
|
/// <summary>
|
2022-12-03 05:41:38 +00:00
|
|
|
/// Day 7: <a href="https://adventofcode.com/2015/day/7"/>
|
2022-11-11 18:42:42 +00:00
|
|
|
/// </summary>
|
2023-09-20 18:38:58 +00:00
|
|
|
public sealed class Day07() : Day(2015, 7, "Some Assembly Required")
|
2022-11-11 18:42:42 +00:00
|
|
|
{
|
2023-12-01 07:30:47 +00:00
|
|
|
private readonly Dictionary<string, Func<ushort>> _actions = [];
|
|
|
|
private readonly Dictionary<string, ushort> _wires = [];
|
2022-11-13 17:56:18 +00:00
|
|
|
|
|
|
|
public override object Part1()
|
|
|
|
{
|
|
|
|
ProcessInstructions();
|
|
|
|
return _actions["a"]();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void ProcessInstructions()
|
|
|
|
{
|
|
|
|
_actions.Clear();
|
|
|
|
_wires.Clear();
|
|
|
|
|
|
|
|
foreach (var line in Input)
|
|
|
|
{
|
|
|
|
var split = line.Split(' ');
|
|
|
|
var destination = split.Last();
|
|
|
|
|
|
|
|
switch (split.Length)
|
|
|
|
{
|
|
|
|
case 3:
|
|
|
|
if (ushort.TryParse(split[0], out var val))
|
|
|
|
{
|
|
|
|
_actions.Add(destination, () => val);
|
|
|
|
_wires.Add(destination, val);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_actions.Add(destination, () =>
|
|
|
|
{
|
2023-09-18 18:47:41 +00:00
|
|
|
if (_wires.TryGetValue(destination, out var wire)) return wire;
|
2022-11-13 17:56:18 +00:00
|
|
|
|
|
|
|
var res = _actions[split[0]]();
|
|
|
|
_wires.Add(destination, res);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
_actions.Add(destination, () => (ushort)~_actions[split[1]]());
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
switch (split[1])
|
|
|
|
{
|
|
|
|
case "AND":
|
|
|
|
_actions.Add(destination, () =>
|
|
|
|
{
|
2023-09-18 18:47:41 +00:00
|
|
|
if (_wires.TryGetValue(destination, out var wire)) return wire;
|
2022-11-11 18:42:42 +00:00
|
|
|
|
2022-11-13 17:56:18 +00:00
|
|
|
var res = (ushort)((ushort.TryParse(split[0], out var v)
|
|
|
|
? v
|
|
|
|
: _actions[split[0]]()) & _actions[split[2]]());
|
|
|
|
_wires.Add(destination, res);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
case "OR":
|
|
|
|
_actions.Add(destination, () =>
|
|
|
|
{
|
2023-09-18 18:47:41 +00:00
|
|
|
if (_wires.TryGetValue(destination, out var wire)) return wire;
|
2022-11-13 17:56:18 +00:00
|
|
|
|
|
|
|
var res = (ushort)((ushort.TryParse(split[0], out var v)
|
|
|
|
? v
|
|
|
|
: _actions[split[0]]()) | _actions[split[2]]());
|
|
|
|
_wires.Add(destination, res);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
case "LSHIFT":
|
|
|
|
_actions.Add(destination, () =>
|
|
|
|
{
|
2023-09-18 18:47:41 +00:00
|
|
|
if (_wires.TryGetValue(destination, out var wire)) return wire;
|
2022-11-13 17:56:18 +00:00
|
|
|
|
|
|
|
var res = (ushort)(_actions[split[0]]() << ushort.Parse(split[2]));
|
|
|
|
_wires.Add(destination, res);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
case "RSHIFT":
|
|
|
|
_actions.Add(destination, () =>
|
|
|
|
{
|
2023-09-18 18:47:41 +00:00
|
|
|
if (_wires.TryGetValue(destination, out var wire)) return wire;
|
2022-11-13 17:56:18 +00:00
|
|
|
|
|
|
|
var res = (ushort)(_actions[split[0]]() >> ushort.Parse(split[2]));
|
|
|
|
_wires.Add(destination, res);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public override object Part2()
|
|
|
|
{
|
|
|
|
ProcessInstructions();
|
|
|
|
var p1 = _actions["a"]();
|
2023-09-18 18:47:41 +00:00
|
|
|
|
2022-11-13 17:56:18 +00:00
|
|
|
ProcessInstructions();
|
2023-09-18 18:47:41 +00:00
|
|
|
|
2022-11-13 17:56:18 +00:00
|
|
|
_actions["b"] = () => p1;
|
|
|
|
return _actions["a"]();
|
|
|
|
}
|
2023-12-05 20:01:01 +00:00
|
|
|
}
|