Day 5: Print Queue
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You are viewing a single thread.
View all comments 5 points
C#
using QuickGraph;
using QuickGraph.Algorithms.TopologicalSort;
public class Day05 : Solver
{
private List<int[]> updates;
private List<int[]> updates_ordered;
public void Presolve(string input) {
var blocks = input.Trim().Split("\n\n");
List<(int, int)> rules = new();
foreach (var line in blocks[0].Split("\n")) {
var pair = line.Split('|');
rules.Add((int.Parse(pair[0]), int.Parse(pair[1])));
}
updates = new();
updates_ordered = new();
foreach (var line in input.Trim().Split("\n\n")[1].Split("\n")) {
var update = line.Split(',').Select(int.Parse).ToArray();
updates.Add(update);
var graph = new AdjacencyGraph<int, Edge<int>>();
graph.AddVertexRange(update);
graph.AddEdgeRange(rules
.Where(rule => update.Contains(rule.Item1) && update.Contains(rule.Item2))
.Select(rule => new Edge<int>(rule.Item1, rule.Item2)));
List<int> ordered_update = [];
new TopologicalSortAlgorithm<int, Edge<int>>(graph).Compute(ordered_update);
updates_ordered.Add(ordered_update.ToArray());
}
}
public string SolveFirst() => updates.Zip(updates_ordered)
.Where(unordered_ordered => unordered_ordered.First.SequenceEqual(unordered_ordered.Second))
.Select(unordered_ordered => unordered_ordered.First)
.Select(update => update[update.Length / 2])
.Sum().ToString();
public string SolveSecond() => updates.Zip(updates_ordered)
.Where(unordered_ordered => !unordered_ordered.First.SequenceEqual(unordered_ordered.Second))
.Select(unordered_ordered => unordered_ordered.Second)
.Select(update => update[update.Length / 2])
.Sum().ToString();
}
2 points
2 points