69 lines
2.5 KiB
C#
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 |