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 }