Minor day 10 updates

I feel like this solution is a little cleaner/clearer. Same concept, just cleaned up the code a little more to my usual style. Some parts are a little bit slower, but I don't mind too much for this purpose.
This commit is contained in:
2021-12-10 10:49:00 -06:00
parent 55b385f779
commit f4a43710b8

110
src/10.cs
View File

@ -12,14 +12,32 @@
Logger.Log(""); Logger.Log("");
} }
private static readonly List<char> Openers = new()
{
'(',
'[',
'{',
'<',
};
private static readonly List<char> Closers = new()
{
')',
']',
'}',
'>',
};
private static bool IsMatching(char open, char close) => Closers.IndexOf(close) == Openers.IndexOf(open);
private static void Part1(IEnumerable<string> lines) private static void Part1(IEnumerable<string> lines)
{ {
Dictionary<char, int> charVals = new() List<int> charVals = new()
{ {
{ ')', 3 }, 3,
{ ']', 57 }, 57,
{ '}', 1197 }, 1197,
{ '>', 25137 }, 25137,
}; };
using var t = new Timer(); using var t = new Timer();
@ -30,7 +48,7 @@
var (corrupted, ch) = IsCorrupted(line); var (corrupted, ch) = IsCorrupted(line);
if (corrupted) if (corrupted)
{ {
score += charVals[ch]; score += charVals[Closers.IndexOf(ch)];
} }
} }
@ -42,30 +60,20 @@
var s = new Stack<char>(); var s = new Stack<char>();
foreach (var ch in line) foreach (var ch in line)
{ {
switch (ch) if (Openers.Contains(ch))
{ {
case '(':
case '[':
case '{':
case '<':
s.Push(ch); s.Push(ch);
break; }
else if (Closers.Contains(ch))
case ')': {
case ']':
case '}':
case '>':
var popped = s.Pop(); var popped = s.Pop();
if (ch == ')' && popped != '(' if (!IsMatching(popped, ch))
|| ch == ']' && popped != '['
|| ch == '}' && popped != '{'
|| ch == '>' && popped != '<')
{ {
return (true, ch); return (true, ch);
} }
break; }
else
default: {
throw new Exception(); throw new Exception();
} }
} }
@ -75,12 +83,12 @@
private static void Part2(IEnumerable<string> lines) private static void Part2(IEnumerable<string> lines)
{ {
Dictionary<char, int> charVals = new() List<int> charVals = new()
{ {
{ '(', 1 }, 1,
{ '[', 2 }, 2,
{ '{', 3 }, 3,
{ '<', 4 }, 4,
}; };
using var t = new Timer(); using var t = new Timer();
@ -97,23 +105,16 @@
var s = new Stack<char>(); var s = new Stack<char>();
foreach (var ch in line) foreach (var ch in line)
{ {
switch (ch) if (Openers.Contains(ch))
{ {
case '(':
case '[':
case '{':
case '<':
s.Push(ch); s.Push(ch);
break; }
else if (Closers.Contains(ch))
case ')': {
case ']':
case '}':
case '>':
s.Pop(); s.Pop();
break; }
else
default: {
throw new Exception(); throw new Exception();
} }
} }
@ -122,26 +123,7 @@
while (s.Count > 0) while (s.Count > 0)
{ {
var ch = s.Pop(); var ch = s.Pop();
if (ch == '(') score = (score * 5) + charVals[Openers.IndexOf(ch)];
{
score *= 5;
score += charVals[ch];
}
else if (ch == '[')
{
score *= 5;
score += charVals[ch];
}
else if (ch == '{')
{
score *= 5;
score += charVals[ch];
}
else if (ch == '<')
{
score *= 5;
score += charVals[ch];
}
} }
scores.Add(score); scores.Add(score);
@ -152,7 +134,7 @@
throw new Exception(); throw new Exception();
} }
var final = scores.OrderBy(x => x).Skip((int)Math.Floor(scores.Count / 2.0)).First(); var final = scores.OrderBy(x => x).Skip(scores.Count / 2).First();
Logger.Log($"part2: {final}"); Logger.Log($"part2: {final}");
} }