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  }