summaryrefslogtreecommitdiff
path: root/2024/go/src
diff options
context:
space:
mode:
Diffstat (limited to '2024/go/src')
-rw-r--r--2024/go/src/day7/main.go131
1 files changed, 131 insertions, 0 deletions
diff --git a/2024/go/src/day7/main.go b/2024/go/src/day7/main.go
new file mode 100644
index 0000000..0f1ce78
--- /dev/null
+++ b/2024/go/src/day7/main.go
@@ -0,0 +1,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))
+}