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
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(); }
Oh! Sort first and then check for equality. Clever!
You’ll need to sort them anyway :)
(my first version of the first part only checked the order, without sorting).