diff --git a/2021/day10/main.go b/2021/day10/main.go new file mode 100644 index 0000000..f816d9f --- /dev/null +++ b/2021/day10/main.go @@ -0,0 +1,81 @@ +package main + +import ( + "fmt" + "sort" + + "github.com/jdkaplan/advent-of-code/aoc" +) + +func main() { + lines := aoc.Input().ReadLines("day10.txt") + fmt.Println(part1(lines)) + fmt.Println(part2(lines)) +} + +func part1(lines []string) (score int) { + for _, l := range lines { + points, _ := parseLine(l) + score += points + } + return +} + +func part2(lines []string) int { + var scores []int + for _, l := range lines { + points, stack := parseLine(l) + if points == 0 { + scores = append(scores, autocomplete(stack)) + } + } + sort.Ints(scores) + return scores[(len(scores)-1)/2] +} + +func parseLine(line string) (score int, stack []rune) { + for _, c := range line { + switch c { + case '(', '[', '{', '<': + stack = append([]rune{c}, stack...) + case ')': + if stack[0] != '(' { + return 3, stack + } + stack = stack[1:] + case ']': + if stack[0] != '[' { + return 57, stack + } + stack = stack[1:] + case '}': + if stack[0] != '{' { + return 1197, stack + } + stack = stack[1:] + case '>': + if stack[0] != '<' { + return 25137, stack + } + stack = stack[1:] + } + } + return 0, stack +} + +func autocomplete(stack []rune) (score int) { + for _, c := range stack { + score *= 5 + switch c { + case '(': + score += 1 + case '[': + score += 2 + case '{': + score += 3 + case '<': + score += 4 + } + } + return +}