summaryrefslogtreecommitdiff
path: root/2024/go/src/day7/main.go
diff options
context:
space:
mode:
authoromagdy <omar.professional8777@gmail.com>2024-12-08 15:26:25 +0200
committeromagdy <omar.professional8777@gmail.com>2024-12-08 15:26:25 +0200
commitfc6ef54eb1b7e91fbcc263ebcc5151e9ec055130 (patch)
tree2c65ebec9ac5dad5434634669001dff117a0b22c /2024/go/src/day7/main.go
parent070e34dbe0562688113e51fc34d3f7d4eeaeded8 (diff)
downloadaoc-fc6ef54eb1b7e91fbcc263ebcc5151e9ec055130.tar.xz
aoc-fc6ef54eb1b7e91fbcc263ebcc5151e9ec055130.zip
Day 8 done.
Diffstat (limited to '2024/go/src/day7/main.go')
-rw-r--r--2024/go/src/day7/main.go123
1 files changed, 91 insertions, 32 deletions
diff --git a/2024/go/src/day7/main.go b/2024/go/src/day7/main.go
index 0f1ce78..413086c 100644
--- a/2024/go/src/day7/main.go
+++ b/2024/go/src/day7/main.go
@@ -19,11 +19,13 @@ func FileRead(path string) string {
type Op = string
const (
- Plus Op = "+"
- Mul Op = "*"
+ Plus Op = "+"
+ Mul Op = "*"
+ Concat Op = "||"
)
-var Ops = [2]Op{Plus, Mul}
+var OpsOne = []Op{Plus, Mul}
+var OpsTwo = []Op{Plus, Mul, Concat}
type Calibration struct {
target int
@@ -32,8 +34,6 @@ type Calibration struct {
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)
@@ -64,7 +64,7 @@ func parseInput(data string) []Calibration {
return cals
}
-func generatePossibleExpressions(opsLeft int, expr *Expression, expressions *[]Expression) {
+func generatePossibleExpressions(opsLeft int, expr *Expression, expressions *[]Expression, Ops []string) {
if opsLeft == 0 {
comb := make([]string, len(*expr))
copy(comb, *expr)
@@ -75,7 +75,7 @@ func generatePossibleExpressions(opsLeft int, expr *Expression, expressions *[]E
*expr = append(*expr, op)
// explore
- generatePossibleExpressions(opsLeft-1, expr, expressions)
+ generatePossibleExpressions(opsLeft-1, expr, expressions, Ops)
// unchoose
*expr = (*expr)[:len(*expr)-1]
@@ -84,48 +84,107 @@ func generatePossibleExpressions(opsLeft int, expr *Expression, expressions *[]E
}
-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
- }
+func removeElement(s []int, i int) ([]int, error) {
+ if i >= len(s) || i < 0 {
+ return nil, fmt.Errorf("Index is out of range. Index is %d with slice length %d", i, len(s))
+ }
+ return append(s[:i], s[i+1:]...), nil
+}
+
+func removeElementString(s []string, i int) ([]string, error) {
+ if i >= len(s) || i < 0 {
+ return nil, fmt.Errorf("Index is out of range. Index is %d with slice length %d", i, len(s))
+ }
+ return append(s[:i], s[i+1:]...), nil
+}
+
+func evalPartOne(vals []int, expression *Expression) int {
+ for _, op := range *expression {
+ left := vals[0]
+ right := vals[1]
+ if op == Mul {
+ vals, _ = removeElement(vals, 0)
+ vals[0] = left * right
+ } else if op == Plus {
+ vals, _ = removeElement(vals, 0)
+ vals[0] = left + right
}
}
- return 5
+ return vals[0]
}
+func evalPartTwo(vals []int, expression *Expression) int {
+ for _, op := range *expression {
+ left := vals[0]
+ right := vals[1]
+ if op == Mul {
+ vals, _ = removeElement(vals, 0)
+ vals[0] = left * right
+ } else if op == Plus {
+ vals, _ = removeElement(vals, 0)
+ vals[0] = left + right
+ } else if op == "||" {
+ vals, _ = removeElement(vals, 0)
+ // vals[0], _ = strconv.Atoi(strconv.Itoa(left) + strconv.Itoa(right))
+ multiplier := 1
+ for temp := right; temp > 0; temp /= 10 {
+ multiplier *= 10
+ }
+ vals[0] = left*multiplier + right
+ }
+ }
+
+ // fmt.Printf("expression: %v\n", (*expression))
+ // fmt.Printf("vals: %v\n", vals)
-func solve_part_one(data string) int {
+ return vals[0]
+}
+func solve_part_one(data string) int64 {
calibrations := parseInput(data)
- ans := 0
+ var ans int64 = 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
+ generatePossibleExpressions((len(calibration.vals) - 1), &[]string{}, &expressions, OpsOne)
+ for _, expr := range expressions {
+ copy_vals := make([]int, len(calibration.vals))
+ copy(copy_vals, calibration.vals)
+ if evalPartOne(copy_vals, &expr) == calibration.target {
+ // fmt.Printf("expr: %v\n", expr)
+ ans += int64(calibration.target)
+ break
+ }
}
- fmt.Printf("expressions: %v\n", expressions)
+ // fmt.Printf("expressions: %v\n", expressions)
expressions = []Expression{}
-
}
return ans
}
-func solve_part_two(data string) int {
- return 5
+func solve_part_two(data string) int64 {
+ calibrations := parseInput(data)
+ var ans int64 = 0
+ for _, calibration := range calibrations {
+ var expressions []Expression
+ generatePossibleExpressions((len(calibration.vals) - 1), &[]string{}, &expressions, OpsTwo)
+ for _, expr := range expressions {
+ copy_vals := make([]int, len(calibration.vals))
+ copy(copy_vals, calibration.vals)
+ if evalPartTwo(copy_vals, &expr) == calibration.target {
+ // fmt.Printf("expr: %v\n", expr)
+ ans += int64(calibration.target)
+ break
+ }
+ }
+ expressions = []Expression{}
+ }
+ return ans
}
func main() {
test := FileRead("../input/day7.test")
- // prod := FileRead("../input/day7.prod")
+ 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))
+ 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))
}