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:
128
src/10.cs
128
src/10.cs
@ -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,31 +60,21 @@
|
|||||||
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 '(':
|
s.Push(ch);
|
||||||
case '[':
|
}
|
||||||
case '{':
|
else if (Closers.Contains(ch))
|
||||||
case '<':
|
{
|
||||||
s.Push(ch);
|
var popped = s.Pop();
|
||||||
break;
|
if (!IsMatching(popped, ch))
|
||||||
|
{
|
||||||
case ')':
|
return (true, ch);
|
||||||
case ']':
|
}
|
||||||
case '}':
|
}
|
||||||
case '>':
|
else
|
||||||
var popped = s.Pop();
|
{
|
||||||
if (ch == ')' && popped != '('
|
throw new Exception();
|
||||||
|| ch == ']' && popped != '['
|
|
||||||
|| ch == '}' && popped != '{'
|
|
||||||
|| ch == '>' && popped != '<')
|
|
||||||
{
|
|
||||||
return (true, ch);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
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,24 +105,17 @@
|
|||||||
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 '(':
|
s.Push(ch);
|
||||||
case '[':
|
}
|
||||||
case '{':
|
else if (Closers.Contains(ch))
|
||||||
case '<':
|
{
|
||||||
s.Push(ch);
|
s.Pop();
|
||||||
break;
|
}
|
||||||
|
else
|
||||||
case ')':
|
{
|
||||||
case ']':
|
throw new Exception();
|
||||||
case '}':
|
|
||||||
case '>':
|
|
||||||
s.Pop();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
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}");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user