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

  • mykl@lemmy.world
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    11 days ago

    Dart

    A bit easier than I first thought it was going to be. I might try it in Uiua later now I’ve got my head around it.

    import 'package:collection/collection.dart';
    import 'package:more/more.dart';
    
    (int, int) solve(List<String> lines) {
      var parts = lines.splitAfter((e) => e == '');
      var pred = SetMultimap.fromEntries(parts.first.skipLast(1).map((e) {
        var ps = e.split('|').map(int.parse);
        return MapEntry(ps.last, ps.first);
      }));
      ordering(a, b) => pred[a].contains(b) ? 1 : 0;
    
      var pageSets = parts.last.map((e) => e.split(',').map(int.parse).toList());
      var ret1 = 0, ret2 = 0;
      for (var pages in pageSets) {
        if (pages.isSorted(ordering)) {
          ret1 += pages[pages.length ~/ 2];
        } else {
          pages.sort(ordering);
          ret2 += pages[pages.length ~/ 2];
        }
      }
      return (ret1, ret2);
    }
    
    part1(List<String> lines) => solve(lines).$1;
    part2(List<String> lines) => solve(lines).$2;