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 1 point
*
I’ve got a “smart” solution and a really dumb one. I’ll start with the smart one (incomplete but you can infer). I did four different ways to try to get it faster, less memory, etc.
// this is from a nuget package. My Mathy roommate told me this was a topological sort.
// It's also my preferred, since it'd perform better on larger data sets.
return lines
.AsParallel()
.Where(line => !IsInOrder(GetSoonestOccurrences(line), aggregateRules))
.Sum(line => line.StableOrderTopologicallyBy(
getDependencies: page =>
aggregateRules.TryGetValue(page, out var mustPreceed) ? mustPreceed.Intersect(line) : Enumerable.Empty<Page>())
.Middle()
);
The dumb solution. These comparisons aren’t fully transitive. I can’t believe it works.
public static SortedSet<Page> Sort3(Page[] line,
Dictionary<Page, System.Collections.Generic.HashSet<Page>> rules)
{
// how the hell is this working?
var sorted = new SortedSet<Page>(new Sort3Comparer(rules));
foreach (var page in line)
sorted.Add(page);
return sorted;
}
public static Page[] OrderBy(Page[] line, Dictionary<Page, System.Collections.Generic.HashSet<Page>> rules)
{
return line.OrderBy(identity, new Sort3Comparer(rules)).ToArray();
}
sealed class Sort3Comparer : IComparer<Page>
{
private readonly Dictionary<Page, System.Collections.Generic.HashSet<Page>> _rules;
public Sort3Comparer(Dictionary<Page, System.Collections.Generic.HashSet<Page>> rules) => _rules = rules;
public int Compare(Page x, Page y)
{
if (_rules.TryGetValue(x, out var xrules))
{
if (xrules.Contains(y))
return -1;
}
if (_rules.TryGetValue(y, out var yrules))
{
if (yrules.Contains(x))
return 1;
}
return 0;
}
}
Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated |
---|---|---|---|---|---|---|
Part2_UsingList (literally just Insert) | 660.3 us | 12.87 us | 23.20 us | 187.5000 | 35.1563 | 1144.86 KB |
Part2_TrackLinkedList (wrong now) | 1,559.7 us | 6.91 us | 6.46 us | 128.9063 | 21.4844 | 795.03 KB |
Part2_TopologicalSort | 732.3 us | 13.97 us | 16.09 us | 285.1563 | 61.5234 | 1718.36 KB |
Part2_SortedSet | 309.1 us | 4.13 us | 3.45 us | 54.1992 | 10.2539 | 328.97 KB |
Part2_OrderBy | 304.5 us | 6.09 us | 9.11 us | 48.8281 | 7.8125 | 301.29 KB |