AOC-2024/07/main.go
2024-12-09 19:10:16 +01:00

161 lines
3.1 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
const FILE_PATH = "./input.txt"
//const FILE_PATH = "./sample.txt"
func LoadInput(filename string) ([]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return nil, err
}
return lines, nil
}
type Calculation struct {
solution int
numbs []int
}
type structuredInput = []Calculation
func TransformInput(lines []string) structuredInput {
var result = make([]Calculation, 0)
var temp []string
var solution int
var numbs []int
var numb int
for _, line := range lines {
numbs = make([]int, 0)
temp = strings.Split(line, ": ")
solution, _ = strconv.Atoi(temp[0])
temp = strings.Split(temp[1], " ")
for _, snumb := range temp {
numb, _ = strconv.Atoi(snumb)
numbs = append(numbs, numb)
}
result = append(result, Calculation{solution, numbs})
}
return result
}
func RekursiveSolverPart1(result int, index int, calc Calculation) bool {
if result > calc.solution {
return false
}
if index == len(calc.numbs)-1 {
return result == calc.solution
}
if RekursiveSolverPart1(result+calc.numbs[index+1], index+1, calc) {
return true
}
return RekursiveSolverPart1(result*calc.numbs[index+1], index+1, calc)
}
func CalculateCalibrationResultPart1(calc Calculation) int {
if RekursiveSolverPart1(calc.numbs[0], 0, calc) {
return calc.solution
}
return 0
}
func Part1(input structuredInput) int {
var result = 0
for _, calc := range input {
result += CalculateCalibrationResultPart1(calc)
}
return result
}
var temp int
func RekursiveSolverPart2(result int, index int, calc Calculation) bool {
if result > calc.solution {
return false
}
if index == len(calc.numbs)-1 {
return result == calc.solution
}
if RekursiveSolverPart2(result+calc.numbs[index+1], index+1, calc) {
return true
}
if RekursiveSolverPart2(result*calc.numbs[index+1], index+1, calc) {
return true
}
temp, _ = strconv.Atoi(strconv.Itoa(result) + strconv.Itoa(calc.numbs[index+1]))
return RekursiveSolverPart2(temp, index+1, calc)
}
func CalculateCalibrationResultPart2(calc Calculation) int {
if RekursiveSolverPart2(calc.numbs[0], 0, calc) {
return calc.solution
}
return 0
}
func Part2(input structuredInput) int {
var result = 0
for _, calc := range input {
result += CalculateCalibrationResultPart2(calc)
}
return result
}
func main() {
var start time.Time
var elapsed time.Duration = 0
input, err := LoadInput(FILE_PATH)
if err != nil {
fmt.Println("Error loading input:", err)
return
}
structuredInput := TransformInput(input)
fmt.Println("Structured Input:", structuredInput)
start = time.Now()
fmt.Println("Solution Part 1: ", Part1(structuredInput))
elapsed = time.Since(start)
fmt.Printf("Part 1 took %s\n", elapsed)
start = time.Now()
fmt.Println("Solution Part 2: ", Part2(structuredInput))
elapsed = time.Since(start)
fmt.Printf("Part 2 took %s\n", elapsed)
}