// #define Day10 #if Day10 var bracketScores = new Dictionary() { { ')', 3 }, { ']', 57 }, { '}', 1197 }, { '>', 25137 } }; var closingBracketExpect = new Dictionary() { { ')', '(' }, { ']', '[' }, { '}', '{' }, { '>', '<' } }; var openingBracketExpect = closingBracketExpect.ToDictionary(x => x.Value, y => y.Key); var completeScores = new Dictionary() { {'(', 1}, {'[', 2}, {'{', 3}, {'<', 4} }; var chunkScores = File.ReadAllLines("day10/input") .Select(CheckChunk) .ToList(); Console.WriteLine(chunkScores.Select(x => x.score).Sum()); int half = chunkScores.Count(x => x.score > 0) / 2; Console.WriteLine( chunkScores .Where(x => x.score == 0) .Select(x => x.remaining) .Select(x => x.Aggregate(0L, (score, c) => score * 5 + completeScores[c])) .OrderBy(x => x) .Skip(half).First()); ChunkScoreAndRemaining CheckChunk(string line) { var stack = new Stack(); foreach (var b in line) { if (openingBracketExpect.Keys.Contains(b)) { stack.Push(b); } else { char openingBracket = stack.Pop(); if (openingBracket != closingBracketExpect[b]) { return new ChunkScoreAndRemaining(bracketScores[b], stack); } } } return new ChunkScoreAndRemaining(0, stack); } record ChunkScoreAndRemaining(long score, Stack remaining); #endif