ben
/
aoc
1
0
Fork 0

2015 day 7

This commit is contained in:
Ben Harris 2022-11-13 12:56:18 -05:00
parent 23b74f07d5
commit cb503f40fe
3 changed files with 118 additions and 4 deletions

View File

@ -12,6 +12,7 @@ public class Test2015
// [DataRow(typeof(Day04), "346386", "9958218")]
[DataRow(typeof(Day05), "258", "53")]
// [DataRow(typeof(Day06), "543903", "14687245")]
[DataRow(typeof(Day07), "3176", "14710")]
public void TestAllDays(Type dayType, string part1, string part2)
{
Common.CheckDay(dayType, part1, part2);
@ -24,6 +25,7 @@ public class Test2015
// [DataRow(typeof(Day04), "609043", "6742839")]
[DataRow(typeof(Day05), "1", "1")]
[DataRow(typeof(Day06), "1000000", "1000000")]
// [DataRow(typeof(Day07), "", "")] // test input doesn't have "a" key
public void CheckTestInputs(Type dayType, string part1, string part2)
{
Day.UseTestInput = true;

View File

@ -5,11 +5,115 @@
/// </summary>
public sealed class Day07 : Day
{
public Day07() : base(2015, 7, "Puzzle Name")
private readonly Dictionary<string, ushort> _wires = new();
private readonly Dictionary<string, Func<ushort>> _actions = new();
public Day07() : base(2015, 7, "Some Assembly Required")
{
}
public override object Part1() => "";
public override object Part1()
{
ProcessInstructions();
return _actions["a"]();
}
public override object Part2() => "";
}
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, () =>
{
if (_wires.ContainsKey(destination)) return _wires[destination];
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, () =>
{
if (_wires.ContainsKey(destination)) return _wires[destination];
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, () =>
{
if (_wires.ContainsKey(destination)) return _wires[destination];
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, () =>
{
if (_wires.ContainsKey(destination)) return _wires[destination];
var res = (ushort)(_actions[split[0]]() << ushort.Parse(split[2]));
_wires.Add(destination, res);
return res;
});
break;
case "RSHIFT":
_actions.Add(destination, () =>
{
if (_wires.ContainsKey(destination)) return _wires[destination];
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"]();
ProcessInstructions();
_actions["b"] = () => p1;
return _actions["a"]();
}
}

View File

@ -0,0 +1,8 @@
123 -> x
456 -> y
x AND y -> d
x OR y -> e
x LSHIFT 2 -> f
y RSHIFT 2 -> g
NOT x -> h
NOT y -> i