91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package day07
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func Part1(input string) int {
|
|
total := 0
|
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
|
|
|
for i := 0; i < len(lines); i++ {
|
|
target, numbers := parseLine(lines[i])
|
|
if validLinePart1(numbers, 1, numbers[0], target) {
|
|
total += target
|
|
}
|
|
}
|
|
|
|
return total
|
|
}
|
|
|
|
func Part2(input string) int {
|
|
total := 0
|
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
|
|
|
for i := 0; i < len(lines); i++ {
|
|
target, numbers := parseLine(lines[i])
|
|
if validLinePart2(numbers, 1, numbers[0], target) {
|
|
total += target
|
|
}
|
|
}
|
|
|
|
return total
|
|
}
|
|
|
|
func parseLine(line string) (int, []int) {
|
|
parts := strings.Split(line, ":")
|
|
target, _ := strconv.Atoi(strings.TrimSpace(parts[0]))
|
|
numberStrings := strings.Fields(parts[1])
|
|
|
|
numbers := make([]int, len(numberStrings))
|
|
for i := 0; i < len(numberStrings); i++ {
|
|
numbers[i], _ = strconv.Atoi(strings.TrimSpace(numberStrings[i]))
|
|
}
|
|
|
|
return target, numbers
|
|
}
|
|
|
|
func validLinePart1(numbers []int, index int, currentValue int, target int) bool {
|
|
if index == len(numbers) {
|
|
return currentValue == target
|
|
}
|
|
|
|
sum := currentValue + numbers[index]
|
|
if validLinePart1(numbers, index+1, sum, target) {
|
|
return true
|
|
}
|
|
|
|
product := currentValue * numbers[index]
|
|
if validLinePart1(numbers, index+1, product, target) {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func validLinePart2(numbers []int, index int, currentValue int, target int) bool {
|
|
if index == len(numbers) {
|
|
return currentValue == target
|
|
}
|
|
|
|
sum := currentValue + numbers[index]
|
|
if validLinePart2(numbers, index+1, sum, target) {
|
|
return true
|
|
}
|
|
|
|
product := currentValue * numbers[index]
|
|
if validLinePart2(numbers, index+1, product, target) {
|
|
return true
|
|
}
|
|
|
|
// Turns 12 || 34 into 1234
|
|
concatenated, _ := strconv.Atoi(strings.TrimSpace(fmt.Sprintf("%d%d", currentValue, numbers[index])))
|
|
if validLinePart2(numbers, index+1, concatenated, target) {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|