|
@@ -53,6 +53,53 @@ func readInput(file *os.File) []Machine {
|
|
|
return machines
|
|
|
}
|
|
|
|
|
|
+func min(a, b int) int {
|
|
|
+ if a < b {
|
|
|
+ return a
|
|
|
+ }
|
|
|
+
|
|
|
+ return b
|
|
|
+}
|
|
|
+
|
|
|
+func calculate(machine Machine, button int) [2]int {
|
|
|
+ var results [2]int
|
|
|
+ otherButton := (button + 1) % 2
|
|
|
+
|
|
|
+ if machine.x%machine.buttons[button].x == 0 && machine.y%machine.buttons[button].y == 0 {
|
|
|
+ results[button] = machine.x / machine.buttons[button].x
|
|
|
+ results[otherButton] = 0
|
|
|
+ return results
|
|
|
+ }
|
|
|
+
|
|
|
+ start := min(machine.x/machine.buttons[button].x, machine.y/machine.buttons[button].y)
|
|
|
+ for start > 0 {
|
|
|
+ if (machine.x-start*machine.buttons[button].x)%machine.buttons[otherButton].x == 0 && (machine.y-start*machine.buttons[button].y)%machine.buttons[otherButton].y == 0 {
|
|
|
+ results[button] = start
|
|
|
+ results[otherButton] = (machine.x - start*machine.buttons[button].x) / machine.buttons[otherButton].x
|
|
|
+ return results
|
|
|
+ }
|
|
|
+
|
|
|
+ start--
|
|
|
+ }
|
|
|
+
|
|
|
+ return results
|
|
|
+}
|
|
|
+
|
|
|
+func checkMachine(machine Machine) int {
|
|
|
+ results := calculate(machine, 0)
|
|
|
+
|
|
|
+ return results[0]*3 + results[1]
|
|
|
+}
|
|
|
+
|
|
|
+func part1(machines []Machine) int {
|
|
|
+ var result int
|
|
|
+ for _, machine := range machines {
|
|
|
+ result += checkMachine(machine)
|
|
|
+ }
|
|
|
+
|
|
|
+ return result
|
|
|
+}
|
|
|
+
|
|
|
func main() {
|
|
|
if len(os.Args) < 2 {
|
|
|
log.Fatal("You need to specify a file!")
|
|
@@ -65,5 +112,5 @@ func main() {
|
|
|
}
|
|
|
|
|
|
machines := readInput(file)
|
|
|
- fmt.Println(machines)
|
|
|
+ fmt.Println("Part1:", part1(machines))
|
|
|
}
|