43 lines
1.4 KiB
C#
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 |