Files
adventofcode2025/7/main.go
Javier-Orestis MANTZIOS 108f50e8ea initialise
2025-01-07 10:39:37 +02:00

85 lines
2.3 KiB
Go

package main
import (
"bufio"
"fmt"
"math"
"os"
"regexp"
"strconv"
"strings"
)
func randomOperator(equation []int) [][]int {
combinationsTotal := math.Pow(3, float64(len(equation)-2))
combinations := [][]int{}
for i:=0;i<int(combinationsTotal);i++ {
combination := strconv.FormatInt(int64(i), 3)
combinationSSlice := strings.Split(combination, "")
prepend := len(equation) - 2 - len(combinationSSlice)
if prepend>0 {
for j:=1;j<=prepend;j++ {
combinationSSlice = append([]string{"0"}, combinationSSlice...)
}
}
combinationISlice := []int{}
for j:=range combinationSSlice {
combinationInt, _ := strconv.Atoi(combinationSSlice[j])
combinationISlice = append(combinationISlice, combinationInt)
}
combinations = append(combinations, combinationISlice)
}
return combinations
}
func calcResult(tillnow, next, operator int) int {
if operator == 0 {
return tillnow + next
} else if operator == 1 {
return tillnow * next
} else {
// find number of digits
digits := 0
helper := next
for helper > 0 {
helper = helper/10
digits++
}
return tillnow*int(math.Pow(10,float64(digits)))+next
}
}
func main() {
file, _ := os.Open("test")
defer file.Close()
scanner := bufio.NewScanner(file)
regexNumber := regexp.MustCompile(`[0-9]+`)
equations := [][]int{}
randomOperators := [][][]int{} // []equation []operators []operator
for scanner.Scan() {
line := scanner.Text()
equationStrings := regexNumber.FindAllString(line, -1)
equationInts := []int{}
for i := range equationStrings {
equationInt, _ := strconv.Atoi(equationStrings[i])
equationInts = append(equationInts, equationInt)
}
equations = append(equations, equationInts)
randomOperators = append(randomOperators,randomOperator(equationInts))
}
result := 0
for i := range equations { // for each equation
for j := range randomOperators[i] { // for each random operator corresponding to the equation
calculations := equations[i][1]
for k:=2;k<len(equations[i]);k++ {
calculations = calcResult(calculations,equations[i][k],randomOperators[i][j][k-2])
}
if calculations == equations[i][0] {
result = result + equations[i][0]
break
}
}
}
fmt.Println(result)
}