65 lines
1.4 KiB
Go
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
|
||
|
}
|