package main import ( "log" "os" "sort" "strings" "github.com/thoas/go-funk" ) func main() { inputBytes, _ := os.ReadFile("input.txt") input := strings.Split(string(inputBytes), "\n") log.Println("Puzzle 1:", puzzle1(input)) log.Println("Puzzle 2:", puzzle2(input)) } func puzzle1(input []string) int { correctClosingChar := map[rune]rune{'(': ')', '[': ']', '{': '}', '<': '>'} points := map[rune]int{')': 3, ']': 57, '}': 1197, '>': 25137} count := 0 for _, line := range input { stack := []rune{} // Check every character in the line for _, char := range line { // If the character is a opening bracket, push it to the stack if char == '(' || char == '[' || char == '{' || char == '<' { stack = append(stack, char) continue } // If the character is a closing bracket, pop the stack if char == ')' || char == ']' || char == '}' || char == '>' { // Check if the char is the correct one topOnStack := stack[len(stack)-1] if char != correctClosingChar[topOnStack] { // It isn't, so add the points of the closing char to the count count += points[char] break } // It is, so pop the stack stack = stack[:len(stack)-1] } } } return count } func puzzle2(input []string) int { correctClosingChar := map[rune]rune{'(': ')', '[': ']', '{': '}', '<': '>'} points := map[rune]int{')': 1, ']': 2, '}': 3, '>': 4} scores := []int{} forlines: for _, line := range input { stack := []rune{} score := 0 // Check every character in the line for _, char := range line { // If the character is a opening bracket, push it to the stack if char == '(' || char == '[' || char == '{' || char == '<' { stack = append(stack, char) continue } // If the character is a closing bracket, pop the stack if char == ')' || char == ']' || char == '}' || char == '>' { // Check if the char is the correct one topOnStack := stack[len(stack)-1] if char != correctClosingChar[topOnStack] { // It isn't, discard the line and continue with the next one continue forlines } // It is, so pop the stack stack = stack[:len(stack)-1] } } // Find correct closing brackets and add their points to the score reversedStack := funk.Reverse(stack).([]rune) for _, char := range reversedStack { score = score*5 + points[correctClosingChar[char]] } // Add the score of the line to the scores scores = append(scores, score) } // Return the middle one from the scores sort.Ints(scores) return scores[len(scores)/2] }