github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2021/day10/day10.dart (about)

     1  import 'dart:convert';
     2  import 'dart:io';
     3  
     4  void main() async {
     5    Stream<String> lines = File("day10.txt")
     6        .openRead()
     7        .transform(Utf8Decoder())
     8        .transform(LineSplitter());
     9  
    10    var totalSyntaxScore = 0;
    11    var autoCompleteScores = <int>[];
    12    await for (var line in lines) {
    13      var result = findSyntaxScore(line);
    14      totalSyntaxScore += result.syntaxScore;
    15      if (result.autoCompleteScore != 0) {
    16        autoCompleteScores.add(result.autoCompleteScore);
    17      }
    18    }
    19    autoCompleteScores.sort();
    20    var middleIndex = (autoCompleteScores.length / 2).round() - 1;
    21    var middleScore = autoCompleteScores[middleIndex];
    22    print("Part 1 Solution: $totalSyntaxScore");
    23    print("Part 2 Solution: $middleScore");
    24  }
    25  
    26  class ScoreResult {
    27    final int syntaxScore;
    28    final int autoCompleteScore;
    29  
    30    ScoreResult(this.syntaxScore, this.autoCompleteScore);
    31  }
    32  
    33  var opening = <String>{'(', '[', '<', '{'};
    34  var closing = <String>{')', ']', '>', '}'};
    35  
    36  var pairs = <String, String>{')': '(', ']': '[', '>': '<', '}': '{'};
    37  var corruptScores = <String, int>{')': 3, ']': 57, '>': 25137, '}': 1197};
    38  
    39  var closingPairs = <String, String>{'(': ')', '[': ']', '<': '>', '{': '}'};
    40  var completeScores = <String, int>{')': 1, ']': 2, '>': 4, '}': 3};
    41  
    42  ScoreResult findSyntaxScore(String line) {
    43    var brackets = line.split("");
    44    var bracketStack = <String>[];
    45  
    46    for (var b in brackets) {
    47      if (bracketStack.isEmpty || opening.contains(b)) {
    48        bracketStack.add(b);
    49      } else {
    50        var top = bracketStack.last;
    51        if (pairs[b] == top) {
    52          bracketStack.removeLast();
    53        } else {
    54          return ScoreResult(corruptScores[b]!, 0);
    55        }
    56      }
    57      // stop at first ilegal closing
    58    }
    59    // not corrupted if got to here
    60    var completeTotal = 0;
    61    while (bracketStack.isNotEmpty) {
    62      var top = bracketStack.removeLast();
    63      var closer = closingPairs[top];
    64      var score = completeScores[closer]!;
    65      completeTotal *= 5;
    66      completeTotal += score;
    67    }
    68    return ScoreResult(0, completeTotal);
    69  }