github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2021/day14/day14.dart (about) 1 import 'dart:convert'; 2 import 'dart:io'; 3 4 import 'parser.dart'; 5 6 void main() async { 7 var lines = await File("day14.txt") 8 .openRead() 9 .transform(Utf8Decoder()) 10 .transform(LineSplitter()) 11 .toList(); 12 13 var solution = Solution(lines); 14 print("Part 1 Solution: ${solution.solve(10)}"); 15 var solution2 = Solution(lines); 16 print("Part 2 Solution: ${solution2.solve(40)}"); 17 } 18 19 class Solution { 20 final Problem problem; 21 Solution(List<String> lines) : problem = Parser(lines).processLines(); 22 23 int solve(int iterations) { 24 for (var i = 0; i < iterations; i++) { 25 iterate(); 26 print(i); 27 } 28 return calculateAnswer(problem.polymer); 29 } 30 31 void iterate() { 32 var polymer = problem.polymer; 33 var rules = problem.rules; 34 for (Node? current = polymer.head!; 35 current?.next != null; 36 current = current.next) { 37 if (current == null) { 38 break; 39 } 40 var next = current.next!; 41 var cv = current.value; 42 var nv = next.value; 43 var pattern = Pattern(cv, nv); 44 if (rules.containsKey(pattern)) { 45 var newNode = Node(rules[pattern]!); 46 newNode.next = next; 47 current.next = newNode; 48 current = newNode; 49 } 50 } 51 } 52 53 int calculateAnswer(LinkedList polymer) { 54 var counts = <String, int>{}; 55 for (var node = polymer.head; node != null; node = node.next) { 56 counts.update(node.value, (value) => ++value, ifAbsent: () => 1); 57 } 58 var smallest = 1 << 63 - 1; 59 var largest = 0; 60 for (var e in counts.entries) { 61 if (e.value < smallest) { 62 smallest = e.value; 63 } 64 if (e.value > largest) { 65 largest = e.value; 66 } 67 } 68 return largest - smallest; 69 } 70 }