summaryrefslogtreecommitdiff
path: root/2024/go/src/day7/main.go
blob: 0f1ce78e98b05793424dca588e0ffa8fe9b36673 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package main

import (
	"fmt"
	"os"
	"strconv"
	"strings"
)

func FileRead(path string) string {
	file, err := os.ReadFile(path)
	if err != nil {
		fmt.Println("Couldn't Read file: ", err)
	}
	return string(file)

}

type Op = string

const (
	Plus Op = "+"
	Mul  Op = "*"
)

var Ops = [2]Op{Plus, Mul}

type Calibration struct {
	target int
	vals   []int
}

type Expression = []string

// 81 + 57 * 52

func (c Calibration) String() string {
	valsStr := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(c.vals)), ", "), "[]")
	return fmt.Sprintf("Calibration(target: %d, vals: [%s])", c.target, valsStr)
}

func parseInput(data string) []Calibration {
	lines := strings.Split(data, "\n")

	var cals []Calibration

	for _, line := range lines {
		if len(line) > 0 {
			cal := strings.Split(line, ": ")
			target, _ := strconv.Atoi(cal[0])
			var vals []int
			for _, num := range strings.Split(cal[1], " ") {
				val, _ := strconv.Atoi(num)
				vals = append(vals, val)
			}
			calibration := Calibration{
				target: target,
				vals:   vals,
			}
			cals = append(cals, calibration)
		}
	}

	return cals
}

func generatePossibleExpressions(opsLeft int, expr *Expression, expressions *[]Expression) {
	if opsLeft == 0 {
		comb := make([]string, len(*expr))
		copy(comb, *expr)
		*expressions = append(*expressions, comb)
	} else {
		for _, op := range Ops {
			// choose
			*expr = append(*expr, op)

			// explore
			generatePossibleExpressions(opsLeft-1, expr, expressions)

			// unchoose
			*expr = (*expr)[:len(*expr)-1]
		}
	}

}

func eval(vals []int, expressions *[]Expression) int {
	for i := len(*expressions) - 1; i >= 0; i-- {
		for j, op := range (*expressions)[i] {
			left := vals[j-1]
			right := vals[j]
			evaluation := 0
			if op == Plus {
				evaluation := left + right
			} else if op == Mul {
				evaluation := left * right
			}
		}
	}

	return 5
}

func solve_part_one(data string) int {
	calibrations := parseInput(data)
	ans := 0
	for _, calibration := range calibrations {
		var expressions []Expression
		generatePossibleExpressions((len(calibration.vals) - 1), &[]string{}, &expressions)
		if eval(calibration.vals, &expressions) == calibration.target {
			ans += calibration.target
		}
		fmt.Printf("expressions: %v\n", expressions)
		expressions = []Expression{}

	}
	return ans
}

func solve_part_two(data string) int {
	return 5
}

func main() {
	test := FileRead("../input/day7.test")
	// prod := FileRead("../input/day7.prod")
	fmt.Println("Part_1 test: ", solve_part_one(test))
	// fmt.Println("Part_1 prod: ", solve_part_one(prod))
	// fmt.Println("Part_2 test: ", solve_part_two(test))
	// fmt.Println("Part_2 prod: ", solve_part_two(prod))
}