mykdavies

AOC2021 Day14

Dec 14th, 2021 (edited)
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 1.73 KB | None | 0 0
  1. import 'dart:io';
  2. import 'package:more/more.dart';
  3. import 'package:collection/collection.dart';
  4.  
  5. late List<String> polymer;
  6. late Map<String, String> inserts;
  7. late Multiset<String> counts;
  8.  
  9. MapEntry<T, T> me<T>(List<T> l) => MapEntry<T, T>(l.first, l.last); //helper
  10. parseLines(List<String> lines) {
  11.   var ls = lines.splitBefore((e) => e.isEmpty).toList();
  12.   polymer = ls.first.first.split('');
  13.   counts = Multiset.from(polymer.window(2).map((e) => e.join()));
  14.   inserts = Map.fromEntries(ls.last.skip(1).map((e) => me(e.split(' -> '))));
  15. }
  16.  
  17. applyInserts() {
  18.   var copy = Multiset.from(counts);
  19.   for (var before in inserts.keys) {
  20.     var after = inserts[before];
  21.     if (after != null) {
  22.       var c = counts[before];
  23.       copy[before] -= c;
  24.       copy[before[0] + after] += c;
  25.       copy[after + before[1]] += c;
  26.     }
  27.   }
  28.   // Could use this to allow almost infinite growth, but two letter pairs
  29.   // only ever appear once each (SO, OK).
  30.   // if (copy.isNotEmpty) {
  31.   //   var mn = copy.counts.min() - 1;
  32.   //   for (var k in copy.distinct.toList()) {
  33.   //     copy[k] -= mn;
  34.   //   }
  35.   // }
  36.   counts = copy;
  37. }
  38.  
  39. score() {
  40.   var sums = Multiset<String>();
  41.   for (var k in counts.distinct) {
  42.     sums[k[0]] += counts[k];
  43.   }
  44.   sums[polymer.last] += 1; // OBOE
  45.   var occs = sums.counts.sorted((a, b) => b.compareTo(a));
  46.   return occs.first - occs.last;
  47. }
  48.  
  49. main() {
  50.   var lines = File('data/data14_01.txt').readAsLinesSync();
  51.   var t = DateTime.now();
  52.   parseLines(lines);
  53.   0.to(10).forEach((e) => applyInserts());
  54.   print(score()); //3408
  55.   parseLines(lines);
  56.   0.to(40).forEach((e) => applyInserts());
  57.   print(score()); // 3724343376942
  58.  
  59.   print('${DateTime.now().difference(t).inMilliseconds} milliseconds');
  60. }
  61.  
Add Comment
Please, Sign In to add comment