ソースを参照

I won't brute force it:(

Piotr Czajkowski 1 週間 前
コミット
3b4b851179
1 ファイル変更17 行追加13 行削除
  1. 17 13
      13/code.go

+ 17 - 13
13/code.go

@@ -9,12 +9,12 @@ import (
 
 type Button struct {
 	id   byte
-	x, y int
+	x, y int64
 }
 
 type Machine struct {
 	buttons []Button
-	x, y    int
+	x, y    int64
 }
 
 func readInput(file *os.File) []Machine {
@@ -53,7 +53,7 @@ func readInput(file *os.File) []Machine {
 	return machines
 }
 
-func min(a, b int) int {
+func min(a, b int64) int64 {
 	if a < b {
 		return a
 	}
@@ -61,8 +61,8 @@ func min(a, b int) int {
 	return b
 }
 
-func calculate(machine Machine, button int, limit int) [2]int {
-	var results [2]int
+func calculate(machine Machine, button int, limit int64, minimum int64) [2]int64 {
+	var results [2]int64
 	otherButton := (button + 1) % 2
 
 	if machine.x%machine.buttons[button].x == 0 && machine.y%machine.buttons[button].y == 0 {
@@ -79,7 +79,7 @@ func calculate(machine Machine, button int, limit int) [2]int {
 		start = limit
 	}
 
-	for ; start > 0; start-- {
+	for ; start > minimum; start-- {
 		deltaX := machine.x - start*machine.buttons[button].x
 		if deltaX%machine.buttons[otherButton].x == 0 {
 			otherPushes := deltaX / machine.buttons[otherButton].x
@@ -100,9 +100,12 @@ func calculate(machine Machine, button int, limit int) [2]int {
 	return results
 }
 
-func checkMachine(machine Machine, limit int) int {
-	resultA := calculate(machine, 0, limit)
-	resultB := calculate(machine, 1, limit)
+func checkMachine(machine Machine, limit int64, modifier int64, minimum int64) int64 {
+	machine.x += modifier
+	machine.y += modifier
+
+	resultA := calculate(machine, 0, limit, minimum)
+	resultB := calculate(machine, 1, limit, minimum)
 
 	costA := resultA[0]*3 + resultA[1]
 	costB := resultB[0]*3 + resultB[1]
@@ -110,10 +113,10 @@ func checkMachine(machine Machine, limit int) int {
 	return min(costA, costB)
 }
 
-func solve(machines []Machine, limit int) int {
-	var result int
+func solve(machines []Machine, limit int64, modifier int64, minimum int64) int64 {
+	var result int64
 	for _, machine := range machines {
-		result += checkMachine(machine, limit)
+		result += checkMachine(machine, limit, modifier, minimum)
 	}
 
 	return result
@@ -131,5 +134,6 @@ func main() {
 	}
 
 	machines := readInput(file)
-	fmt.Println("Part1:", solve(machines, 100))
+	fmt.Println("Part1:", solve(machines, 100, 0, 0))
+	fmt.Println("Part2:", solve(machines, -1, 10000000000000, 100000000000))
 }