package day07 import ( "adventofcode2024/utils" "fmt" "strconv" "strings" ) type Op int const ( Add Op = iota Mul Conc ) func Part1(input string) int { val := 0 lines := strings.Split(input, "\n") for _, line := range lines { parts := strings.Split(line, ":") result := utils.MustAtoi(parts[0]) numStrings := strings.Fields(parts[1]) var numbers []int for _, numStr := range numStrings { num := utils.MustAtoi(numStr) numbers = append(numbers, num) } bitmask := 1 << (len(numbers) - 1) for i := 0; i < bitmask; i++ { calc := 0 switch isNthBitSet(i, 0) { case true: calc = numbers[0] + numbers[1] case false: calc = numbers[0] * numbers[1] } for n := 1; n < len(numbers)-1; n++ { switch isNthBitSet(i, n) { case true: calc = calc + numbers[n+1] case false: calc = calc * numbers[n+1] } } if calc == result { fmt.Printf("result: %v numbers:%v count: %d\n", result, numbers, bitmask) val += result break } } } return val } func Part2(input string) int { val := 0 lines := strings.Split(input, "\n") for _, line := range lines { parts := strings.Split(line, ":") result := utils.MustAtoi(parts[0]) numStrings := strings.Fields(parts[1]) var numbers []int for _, numStr := range numStrings { num := utils.MustAtoi(numStr) numbers = append(numbers, num) } operations := []Op{Add, Mul, Conc} results := [][]Op{} generatePermutations(operations, len(numbers)-1, []Op{}, &results) for _, op := range results { calc := 0 switch op[0] { case Add: calc = numbers[0] + numbers[1] case Mul: calc = numbers[0] * numbers[1] case Conc: calc = concat(numbers[0], numbers[1]) } for n := 1; n < len(numbers)-1; n++ { switch op[n] { case Add: calc = calc + numbers[n+1] case Mul: calc = calc * numbers[n+1] case Conc: calc = concat(calc, numbers[n+1]) } } if calc == result { fmt.Printf("result: %v numbers:%v\n", result, numbers) val += result break } } } return val } func isNthBitSet(num, n int) bool { return num&(1<