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
Well, this one ended up with a surprisingly easy part 2 with how I wrote it.
Not the most computationally optimal code, but since they’re still cheap enough to run in milliseconds I’m not overly bothered.
C#
class OrderComparer : IComparer<int> { Dictionary<int, List<int>> ordering; public OrderComparer(Dictionary<int, List<int>> ordering) { this.ordering = ordering; } public int Compare(int x, int y) { if (ordering.ContainsKey(x) && ordering[x].Contains(y)) return -1; return 1; } } Dictionary<int, List<int>> ordering = new Dictionary<int, List<int>>(); int[][] updates = new int[0][]; public void Input(IEnumerable<string> lines) { foreach (var pair in lines.TakeWhile(l => l.Contains('|')).Select(l => l.Split('|').Select(w => int.Parse(w)))) { if (!ordering.ContainsKey(pair.First())) ordering[pair.First()] = new List<int>(); ordering[pair.First()].Add(pair.Last()); } updates = lines.SkipWhile(s => s.Contains('|') || string.IsNullOrWhiteSpace(s)).Select(l => l.Split(',').Select(w => int.Parse(w)).ToArray()).ToArray(); } public void Part1() { int correct = 0; var comparer = new OrderComparer(ordering); foreach (var update in updates) { var ordered = update.Order(comparer); if (update.SequenceEqual(ordered)) correct += ordered.Skip(ordered.Count() / 2).First(); } Console.WriteLine($"Sum: {correct}"); } public void Part2() { int incorrect = 0; var comparer = new OrderComparer(ordering); foreach (var update in updates) { var ordered = update.Order(comparer); if (!update.SequenceEqual(ordered)) incorrect += ordered.Skip(ordered.Count() / 2).First(); } Console.WriteLine($"Sum: {incorrect}"); }