Advertisement
mykdavies

AOC 2022 Day 11

Dec 11th, 2022 (edited)
537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 2.86 KB | None | 0 0
  1. /// Monkeys operates on lists of values and pass them around. How many times
  2. /// do they operate on items under given circumstances?
  3. /// 1) with simple rules
  4. /// 2) with big big big numbers
  5.  
  6. // ignore_for_file: unused_import
  7.  
  8. import 'package:collection/collection.dart';
  9. import 'package:more/more.dart';
  10. //import 'package:collection/collection.dart';
  11.  
  12. class Monkey {
  13.   List<int> items;
  14.   String operation;
  15.   int worryFactor;
  16.   int divisor;
  17.   List<int> destinations;
  18.   int inspections = 0;
  19.   Monkey(this.items, this.operation, this.worryFactor, this.divisor,
  20.       this.destinations);
  21.  
  22.   factory Monkey.fromStringList(List<String> m) {
  23.     var items = m[1].split(': ').last.split(', ').map(int.parse).toList();
  24.     var op = m[2].split('= ').last;
  25.     var div = int.parse(m[3].split('by ').last);
  26.     var dests =
  27.         [m[4], m[5]].map((e) => int.parse(e.split('monkey ').last)).toList();
  28.     return Monkey(items, op, 3, div, dests);
  29.   }
  30.   int findDest() {
  31.     inspections += 1;
  32.     var parts = operation.split(' ');
  33.     int arg1 = parts[0] == 'old' ? items.first : int.parse(parts[0]);
  34.     int arg2 = parts[2] == 'old' ? items.first : int.parse(parts[2]);
  35.     var op = parts[1];
  36.     var val = 0;
  37.     if (op == '*') {
  38.       val = arg1 * arg2;
  39.     } else if (op == '+') {
  40.       val = arg1 + arg2;
  41.     } else if (op == '-') {
  42.       val = arg1 - arg2;
  43.     }
  44.     // Apply general worry rule
  45.     val ~/= worryFactor;
  46.  
  47.     items[0] = val;
  48.     return (val % divisor == 0) ? destinations.first : destinations.last;
  49.   }
  50. }
  51.  
  52. part1(List<String> lines) {
  53.   var inputs = lines.chunked(7);
  54.   var monkeys = <Monkey>[];
  55.   for (var m in inputs) {
  56.     monkeys.add(Monkey.fromStringList(m)..worryFactor = 3);
  57.   }
  58.   for (var _ in 0.to(20)) {
  59.     for (var m in monkeys) {
  60.       while (m.items.isNotEmpty) {
  61.         var dest = m.findDest();
  62.         var item = m.items.removeAt(0);
  63.         monkeys[dest].items.add(item);
  64.       }
  65.     }
  66.   }
  67.   return monkeys
  68.       .map((e) => e.inspections)
  69.       .toList()
  70.       .sorted((a, b) => b.compareTo(a))
  71.       .take(2)
  72.       .reduce((s, t) => s * t);
  73. }
  74.  
  75. part2(List<String> lines) {
  76.   var inputs = lines.chunked(7);
  77.   var monkeys = <Monkey>[];
  78.   var minCommonMult = 1;
  79.   for (var m in inputs) {
  80.     var monkey = Monkey.fromStringList(m)..worryFactor = 1;
  81.     minCommonMult *= monkey.divisor;
  82.     monkeys.add(monkey);
  83.   }
  84.   for (var _ in 0.to(10000)) {
  85.     for (var m in monkeys) {
  86.       while (m.items.isNotEmpty) {
  87.         var dest = m.findDest();
  88.         var item = m.items.removeAt(0);
  89.         // mod by the minimum common mulitplier of all the operations.
  90.         item = item % minCommonMult;
  91.         monkeys[dest].items.add(item);
  92.       }
  93.     }
  94.   }
  95.   return monkeys
  96.       .map((e) => e.inspections)
  97.       .toList()
  98.       .sorted((a, b) => b.compareTo(a))
  99.       .take(2)
  100.       .reduce((s, t) => s * t);
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement