2021aoc/Day8.cs

69 lines
2.5 KiB
C#

// #define Day8
#if Day8
using System.Collections.Immutable;
var allSignals = File.ReadLines("day8/input").Select(l => {
var seg = l.Split(" ").Where(s => s != "|")
.ToList();
return new Segments(seg.SkipLast(4).ToList(), seg.TakeLast(4).ToList());
}).ToList();
var partOne = allSignals.Select(sig => sig.result.Count(s => s.Length == 2 || s.Length == 4 || s.Length == 3 || s.Length == 7)).Sum();
Console.WriteLine(partOne);
var solutions = new Dictionary<string, string>() {
{"abcefg", "0"},
{"cf", "1"},
{"acdeg", "2"},
{"acdfg", "3"},
{"bcdf", "4"},
{"abdfg", "5"},
{"abdefg", "6"},
{"acf", "7"},
{"abcdefg", "8"},
{"abcdfg", "9"},
};
var partTwo = allSignals.Select(segments => {
var translate = Solve(segments.unique);
var numbers = segments.result.Select(s => s.Select(c => translate[c]))
.Select(tc => String.Join("", tc.OrderBy(c => c)))
.Select(joined => solutions[joined]).ToList();
return long.Parse(String.Join("", numbers));
}).Sum();
Console.WriteLine(partTwo);
Dictionary<char, char> Solve(List<string> unique) {
var original = new Dictionary<char, char>();
var patterns = unique.Select(s => ImmutableHashSet.Create(s.ToCharArray())).ToList();
var one = patterns.First(p => p.Count == 2);
var seven = patterns.First(p => p.Count == 3);
var four = patterns.First(p => p.Count == 4);
var eight = patterns.First(p => p.Count == 7);
var zeroSixOrNine = patterns.Where(p => p.Count == 6).ToList();
var twoThreeOrFive = patterns.Where(p => p.Count == 5).ToList();
original['a'] = seven.Except(one).First();
var eAndG = zeroSixOrNine.SelectMany(num => num.Except(four).Remove(original['a']))
.GroupBy(c => c).ToDictionary(g => g.Count(), g => g.Key);
original['e'] = eAndG[2];
original['g'] = eAndG[3];
var two = twoThreeOrFive.First(num => num.Contains(original['e']));
var three = twoThreeOrFive.Where(num => !num.Except(two).IsEmpty).First(num => num.Except(two).Except(one).IsEmpty);
var five = twoThreeOrFive.First(num => !num.Except(two).IsEmpty && !num.Except(three).IsEmpty);
original['b'] = five.Except(two).Except(three).First();
original['c'] = two.Except(five).Remove(original['e']).First();
original['f'] = one.Remove(original['c']).First();
original['d'] = eight.Except(original.Values).First();
return original.ToDictionary(e => e.Value, e => e.Key);
}
record Segments(List<string> unique, List<string> result);
#endif