// #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() { {"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 Solve(List unique) { var original = new Dictionary(); 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 unique, List result); #endif