2021aoc/Day10.cs

43 lines
1.4 KiB
C#

// #define Day10
#if Day10
var bracketScores = new Dictionary<char, int>() { { ')', 3 }, { ']', 57 }, { '}', 1197 }, { '>', 25137 } };
var closingBracketExpect = new Dictionary<char, char>() { { ')', '(' }, { ']', '[' }, { '}', '{' }, { '>', '<' } };
var openingBracketExpect = closingBracketExpect.ToDictionary(x => x.Value, y => y.Key);
var completeScores = new Dictionary<char, int>() { {'(', 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<char>();
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<char> remaining);
#endif