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

  • AnanaceA
    link
    fedilink
    arrow-up
    1
    ·
    10 days ago

    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}");
    }