AoC2021/src/day10/day10.go
2021-12-10 14:15:05 +01:00

65 lines
1.4 KiB
Go

package main
import (
"AOC2021/src/helper"
"fmt"
"os"
"sort"
)
func main() {
args := os.Args[1:]
input, err := helper.GetInput(args[0])
if err != nil {
fmt.Println(err)
}
pointsMapper := map[rune]int{')': 3, ']': 57, '}': 1197, '>': 25137}
sumPart1 := 0
sumsPart2 := make([]int,0)
for _, row := range input {
errorRune, restScore := checkRow(row)
sumPart1 += pointsMapper[errorRune]
if errorRune == ' ' {
sumsPart2 = append(sumsPart2, restScore)
}
}
fmt.Println(sumPart1)
sort.Ints(sumsPart2)
fmt.Println(sumsPart2[len(sumsPart2)/2])
}
func checkRow(row string) (errorRune rune, restScore int) {
openChunks := make([]rune, 0)
errorRune = ' '
for _, char := range row {
switch char {
case '(', '[', '{', '<':
openChunks = append(openChunks, char)
case '>', ']', '}':
if char != openChunks[len(openChunks)-1]+2 {
errorRune = char
return
}
openChunks = openChunks[:len(openChunks)-1]
case ')':
if char != openChunks[len(openChunks)-1]+1 {
errorRune = char
return
}
openChunks = openChunks[:len(openChunks)-1]
}
}
restScore = caclulateScoreForIncompletePart(openChunks)
return
}
func caclulateScoreForIncompletePart(openChunks []rune) int {
pointsMapper := map[rune]int{'(': 1, '[': 2, '{': 3, '<': 4}
sum := 0
for i := len(openChunks)-1; i>= 0; i-- {
pointForChar := pointsMapper[openChunks[i]]
sum = sum * 5 + pointForChar
}
return sum
}