diff --git a/Sources/10/10.swift b/Sources/10/10.swift index 395dd2a..1eccc2d 100644 --- a/Sources/10/10.swift +++ b/Sources/10/10.swift @@ -20,28 +20,40 @@ struct Day10: Runnable { //.map { line in line.map { $0.wholeNumberValue! } } var s = Deque() var illegalCharacters = [String.Element]() + var autocompleteScores = [Int]() for (lineNumber, line) in lines.enumerated() { + s = Deque() + var isIllegalLine = false for char in line { if char.isClosing { - if let popped = s.popFirst() { - if let shouldBeClosedBy = popped.closedBy { - if shouldBeClosedBy == char { - continue // Valid chunk - } - print("Line: \(lineNumber): Expected \(shouldBeClosedBy), but found \(char) instead") - illegalCharacters.append(char) - break - } else { - print("\(popped) should be an opening character, but cannot find a fitting closing char. Line: \(lineNumber+1), char: \(char)") - } - } else { - print("Found closing character \(char), but empty list!") + guard let popped = s.popFirst() else { + fatalError() } + guard let shouldBeClosedBy = popped.closedBy else { + fatalError() + } + if shouldBeClosedBy == char { + continue // Valid chunk + } + //print("Line: \(lineNumber): Expected \(shouldBeClosedBy), but found \(char) instead") + illegalCharacters.append(char) + isIllegalLine = true + break } s.prepend(char) } + if !isIllegalLine { + var lineScore = 0 + s.reverse() + while let last = s.popLast() { + let charValue = last.closedBy!.autocompleteScore! + lineScore = lineScore * 5 + charValue + } + autocompleteScores.append(lineScore) + } } print(illegalCharacters.map{$0.score!}.reduce(0,+)) + print(autocompleteScores.sorted()[autocompleteScores.count / 2]) } @@ -78,4 +90,19 @@ extension String.Element { return nil } } + + var autocompleteScore: Int? { + switch self { + case ")": + return 1 + case "]": + return 2 + case "}": + return 3 + case ">": + return 4 + default: + return nil + } + } }