85 lines
2.3 KiB
Go
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)
|
|
}
|