|
| 1 | +package day7 |
| 2 | + |
| 3 | +import ( |
| 4 | + "slices" |
| 5 | + "strconv" |
| 6 | + "strings" |
| 7 | +) |
| 8 | + |
| 9 | +type equation struct { |
| 10 | + result uint |
| 11 | + coefficients []uint |
| 12 | +} |
| 13 | + |
| 14 | +func Solve(input string) uint { |
| 15 | + equations := parseInput(input) |
| 16 | + return solve(equations) |
| 17 | +} |
| 18 | + |
| 19 | +func parseInput(input string) []equation { |
| 20 | + result := make([]equation, 0) |
| 21 | + for _, line := range strings.Split(input, "\n") { |
| 22 | + var eqn equation |
| 23 | + pieces := strings.Split(line, ": ") |
| 24 | + if len(pieces) != 2 { |
| 25 | + continue |
| 26 | + } |
| 27 | + |
| 28 | + x, err := strconv.Atoi(pieces[0]) |
| 29 | + if err != nil { |
| 30 | + continue |
| 31 | + } |
| 32 | + eqn.result = uint(x) |
| 33 | + |
| 34 | + for _, coef := range strings.Split(pieces[1], " ") { |
| 35 | + y, err := strconv.Atoi(coef) |
| 36 | + if err != nil { |
| 37 | + continue |
| 38 | + } |
| 39 | + eqn.coefficients = slices.Insert(eqn.coefficients, len(eqn.coefficients), uint(y)) |
| 40 | + } |
| 41 | + |
| 42 | + result = slices.Insert(result, len(result), eqn) |
| 43 | + } |
| 44 | + return result |
| 45 | +} |
| 46 | + |
| 47 | +func solve(eqns []equation) uint { |
| 48 | + var result uint = 0 |
| 49 | + for _, eqn := range eqns { |
| 50 | + if trueEquation(eqn) { |
| 51 | + result += eqn.result |
| 52 | + } |
| 53 | + } |
| 54 | + return result |
| 55 | +} |
| 56 | + |
| 57 | +func trueEquation(eqn equation) bool { |
| 58 | + possibilities := []uint{eqn.coefficients[0]} |
| 59 | + for i, coef := range eqn.coefficients { |
| 60 | + if i == 0 { |
| 61 | + continue |
| 62 | + } |
| 63 | + |
| 64 | + updatedPossibilities := []uint{} |
| 65 | + for _, priorPartial := range possibilities { |
| 66 | + sum := priorPartial + coef |
| 67 | + if sum <= eqn.result { |
| 68 | + updatedPossibilities = slices.Insert(updatedPossibilities, len(updatedPossibilities), sum) |
| 69 | + } |
| 70 | + mult := priorPartial * coef |
| 71 | + if mult <= eqn.result { |
| 72 | + updatedPossibilities = slices.Insert(updatedPossibilities, len(updatedPossibilities), mult) |
| 73 | + } |
| 74 | + } |
| 75 | + possibilities = updatedPossibilities |
| 76 | + } |
| 77 | + |
| 78 | + for _, poss := range possibilities { |
| 79 | + if poss == eqn.result { |
| 80 | + return true |
| 81 | + } |
| 82 | + } |
| 83 | + return false |
| 84 | +} |
0 commit comments