aoc2021/aoc2021/Day08.cs

86 lines
2.3 KiB
C#
Raw Normal View History

2021-12-08 05:09:23 +00:00
namespace aoc2021;
/// <summary>
/// Day 8: <see href="https://adventofcode.com/2021/day/8"/>
/// </summary>
public sealed class Day08 : Day
{
2021-12-08 16:35:24 +00:00
private static readonly List<char[]> PossibleMappings =
"abcdefg".ToCharArray().Permute().Select(m => m.ToArray()).ToList();
2021-12-08 05:09:23 +00:00
public Day08() : base(8, "Seven Segment Search")
{
2021-12-08 06:42:15 +00:00
}
2021-12-08 16:35:24 +00:00
private static int MatchDigit(string lit) =>
lit switch
2021-12-08 06:42:15 +00:00
{
"1110111" => 0,
"0010010" => 1,
"1011101" => 2,
"1011011" => 3,
"0111010" => 4,
"1101011" => 5,
"1101111" => 6,
"1010010" => 7,
"1111111" => 8,
"1111011" => 9,
_ => -1
};
private static int Decode(string line)
{
var s = line.Split(" | ").Select(s => s.Split(' ')).ToList();
int i;
2021-12-08 16:32:37 +00:00
char[] lit;
2021-12-08 06:42:15 +00:00
for (i = 0; i < PossibleMappings.Count; i++)
{
2021-12-08 16:32:37 +00:00
var matches = 0;
2021-12-08 06:42:15 +00:00
var failed = false;
foreach (var signal in s[0])
{
2021-12-08 16:32:37 +00:00
lit = "0000000".ToCharArray();
2021-12-08 06:42:15 +00:00
foreach (var c in signal)
lit[Array.IndexOf(PossibleMappings[i], c)] = '1';
2021-12-08 16:32:37 +00:00
var match = MatchDigit(new(lit));
2021-12-08 06:42:15 +00:00
if (match == -1)
{
failed = true;
break;
}
2021-12-08 16:32:37 +00:00
matches++;
2021-12-08 06:42:15 +00:00
}
if (failed) continue;
2021-12-08 16:32:37 +00:00
if (matches == 10) break;
}
if (i == PossibleMappings.Count)
{
throw new("no mapping found");
}
var digits = new StringBuilder();
foreach (var o in s[1])
{
lit = "0000000".ToCharArray();
foreach (var c in o)
lit[Array.IndexOf(PossibleMappings[i], c)] = '1';
digits.Append(MatchDigit(new(lit)));
2021-12-08 06:42:15 +00:00
}
2021-12-08 16:32:37 +00:00
return int.Parse(digits.ToString());
2021-12-08 05:09:23 +00:00
}
2021-12-12 20:09:41 +00:00
public override object Part1() =>
2021-12-08 05:11:17 +00:00
Input
.Select(line => line.Split(" | ")[1].Split(' '))
.Select(outputs => outputs.Count(o => new[] { 2, 3, 4, 7 }.Contains(o.Length)))
2021-12-12 20:09:41 +00:00
.Sum();
2021-12-08 05:09:23 +00:00
2021-12-12 20:09:41 +00:00
public override object Part2() => Input.Select(Decode).Sum();
2021-12-08 05:09:23 +00:00
}