Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:io';
- import 'package:more/more.dart';
- import 'package:collection/collection.dart';
- late List<String> polymer;
- late Map<String, String> inserts;
- late Multiset<String> counts;
- MapEntry<T, T> me<T>(List<T> l) => MapEntry<T, T>(l.first, l.last); //helper
- parseLines(List<String> lines) {
- var ls = lines.splitBefore((e) => e.isEmpty).toList();
- polymer = ls.first.first.split('');
- counts = Multiset.from(polymer.window(2).map((e) => e.join()));
- inserts = Map.fromEntries(ls.last.skip(1).map((e) => me(e.split(' -> '))));
- }
- applyInserts() {
- var copy = Multiset.from(counts);
- for (var before in inserts.keys) {
- var after = inserts[before];
- if (after != null) {
- var c = counts[before];
- copy[before] -= c;
- copy[before[0] + after] += c;
- copy[after + before[1]] += c;
- }
- }
- // Could use this to allow almost infinite growth, but two letter pairs
- // only ever appear once each (SO, OK).
- // if (copy.isNotEmpty) {
- // var mn = copy.counts.min() - 1;
- // for (var k in copy.distinct.toList()) {
- // copy[k] -= mn;
- // }
- // }
- counts = copy;
- }
- score() {
- var sums = Multiset<String>();
- for (var k in counts.distinct) {
- sums[k[0]] += counts[k];
- }
- sums[polymer.last] += 1; // OBOE
- var occs = sums.counts.sorted((a, b) => b.compareTo(a));
- return occs.first - occs.last;
- }
- main() {
- var lines = File('data/data14_01.txt').readAsLinesSync();
- var t = DateTime.now();
- parseLines(lines);
- 0.to(10).forEach((e) => applyInserts());
- print(score()); //3408
- parseLines(lines);
- 0.to(40).forEach((e) => applyInserts());
- print(score()); // 3724343376942
- print('${DateTime.now().difference(t).inMilliseconds} milliseconds');
- }
Add Comment
Please, Sign In to add comment