feat: solve day 5 part 1

This commit is contained in:
Stevan Freeborn
2024-12-05 23:10:08 -06:00
parent d8f67e85ca
commit a9f9dec7aa
9 changed files with 292 additions and 6 deletions
+3
View File
@@ -0,0 +1,3 @@
namespace PrintQueue;
record OrderRule(int X, int Y);
+3
View File
@@ -0,0 +1,3 @@
namespace PrintQueue;
record ParseResult(List<OrderRule> Rules, List<Update> Updates);
+15 -6
View File
@@ -1,5 +1,7 @@
using System.Diagnostics;
using PrintQueue;
if (args.Length is 0)
{
Console.WriteLine("Please provide a path to the input file.");
@@ -13,14 +15,21 @@ if (File.Exists(args[0]) is false)
}
var isPart2 = args.Length is 2 && args[1] is "part2";
var input = await File.ReadAllLinesAsync(args[0]);
var input = await File.ReadAllTextAsync(args[0]);
var stopwatch = new Stopwatch();
stopwatch.Start();
// TODO: Perform work here
stopwatch.Stop();
var parser = new PuzzleParser();
// TODO: Print results
Console.WriteLine($". ({stopwatch.ElapsedMilliseconds}ms)");
var parseResult = parser.Parse(input);
var validator = new UpdateValidator(parseResult.Rules);
var result = parseResult.Updates
.Where(u => validator.Validate(u))
.Select(u => u.GetMiddlePage())
.Sum();
stopwatch.Stop();
Console.WriteLine($"The sum of the page numbers is {result}. ({stopwatch.ElapsedMilliseconds}ms)");
+36
View File
@@ -0,0 +1,36 @@
namespace PrintQueue;
class PuzzleParser
{
public ParseResult Parse(string input)
{
var inputParts = input.Split($"{Environment.NewLine}{Environment.NewLine}");
var rules = ParseRules(inputParts[0]);
var updates = ParseUpdates(inputParts[1]);
return new ParseResult(rules, updates);
}
private static List<Update> ParseUpdates(string input)
{
return input.Split(Environment.NewLine)
.Select(s => new Update(
s.Split(",").Select(int.Parse).ToList()
))
.ToList();
}
private static List<OrderRule> ParseRules(string input)
{
return input
.Split(Environment.NewLine)
.Select(s =>
{
var parts = s.Split("|");
return new OrderRule(
int.Parse(parts[0]),
int.Parse(parts[1])
);
})
.ToList();
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace PrintQueue;
record Update(List<int> Pages)
{
public int GetMiddlePage()
{
return Pages.Count is 0 ? 0 : Pages[Pages.Count / 2];
}
}
+47
View File
@@ -0,0 +1,47 @@
namespace PrintQueue;
class UpdateValidator
{
public readonly Dictionary<int, HashSet<int>> Graph = [];
public UpdateValidator(List<OrderRule> rules)
{
foreach (var rule in rules)
{
if (Graph.ContainsKey(rule.X) is false)
{
Graph.Add(rule.X, []);
}
if (Graph.ContainsKey(rule.Y) is false)
{
Graph.Add(rule.Y, []);
}
Graph[rule.X].Add(rule.Y);
}
}
public bool Validate(Update update)
{
var previousPages = new List<int>();
foreach (var page in update.Pages)
{
foreach (var previousPage in previousPages)
{
if (
Graph.TryGetValue(previousPage, out HashSet<int>? value) &&
value.Contains(page) is false
)
{
return false;
}
}
previousPages.Add(page);
}
return true;
}
}