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

  • hades@lemm.ee
    link
    fedilink
    arrow-up
    5
    ·
    7 days ago

    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();
    }
    
      • hades@lemm.ee
        link
        fedilink
        arrow-up
        2
        ·
        7 days ago

        You’ll need to sort them anyway :)

        (my first version of the first part only checked the order, without sorting).