Skip to content

Commit 6ba160b

Browse files
committed
Clean up 2024 day 13
1 parent 0df8f3c commit 6ba160b

File tree

1 file changed

+9
-34
lines changed

1 file changed

+9
-34
lines changed

src/main/scala/eu/sim642/adventofcode2024/Day13.scala

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,33 @@
11
package eu.sim642.adventofcode2024
22

3-
import eu.sim642.adventofcodelib.graph.{Dijkstra, GraphSearch, TargetNode}
4-
import eu.sim642.adventofcodelib.pos.Pos
53
import eu.sim642.adventofcodelib.IntegralImplicits.*
6-
import eu.sim642.adventofcodelib.NumberTheory
4+
import eu.sim642.adventofcodelib.pos.Pos
75

86
object Day13 {
97

10-
case class LongPos(x: Long, y: Long)
8+
case class LongPos(x: Long, y: Long) // TODO: generalize library
119

1210
case class ClawMachine(buttonA: Pos, buttonB: Pos, prize: LongPos)
1311

1412
trait Part {
15-
def minWinTokens(clawMachine: ClawMachine): Long
13+
def minWinTokens(clawMachine: ClawMachine): Option[Long]
1614

17-
def sumMinWinTokens(clawMachines: Seq[ClawMachine]): Long = clawMachines.map(minWinTokens).sum
15+
def sumMinWinTokens(clawMachines: Seq[ClawMachine]): Long = clawMachines.flatMap(minWinTokens).sum
1816
}
1917

2018
object Part1 extends Part {
21-
override def minWinTokens(clawMachine: ClawMachine): Long = {
19+
override def minWinTokens(clawMachine: ClawMachine): Option[Long] = {
2220
val ClawMachine(buttonA, buttonB, prize) = clawMachine
23-
24-
/*val graphSearch = new GraphSearch[Pos] with TargetNode[Pos] {
25-
override val startNode: Pos = Pos.zero
26-
27-
override def neighbors(pos: Pos): IterableOnce[(Pos, Int)] = {
28-
for {
29-
(button, tokens) <- Seq(clawMachine.buttonA -> 3, clawMachine.buttonB -> 1)
30-
newPos = pos + button
31-
if newPos <= targetNode
32-
} yield newPos -> tokens
33-
}
34-
35-
override val targetNode: Pos = clawMachine.prize
36-
}
37-
38-
Dijkstra.search(graphSearch).target.map(_._2).getOrElse(0)*/
39-
40-
/*(for {
41-
timesA <- 0 to 100
42-
prizeB = prize - timesA *: buttonA
43-
timesB <- prizeB.x /! buttonB.x
44-
if timesB * buttonB.y == prizeB.y
45-
} yield 3 * timesA + timesB).minOption.getOrElse(0)*/
46-
47-
(for {
21+
// linear system of 2 equations
22+
for {
4823
timesB <- (prize.x * buttonA.y - prize.y * buttonA.x) /! (buttonB.x * buttonA.y - buttonB.y * buttonA.x)
4924
timesA <- (prize.x - timesB * buttonB.x) /! buttonA.x
50-
} yield 3 * timesA + timesB).getOrElse(0)
25+
} yield 3 * timesA + timesB
5126
}
5227
}
5328

5429
object Part2 extends Part {
55-
override def minWinTokens(clawMachine: ClawMachine): Long = {
30+
override def minWinTokens(clawMachine: ClawMachine): Option[Long] = {
5631
val newClawMachine = clawMachine.copy(prize = LongPos(clawMachine.prize.x + 10000000000000L, clawMachine.prize.y + 10000000000000L))
5732
Part1.minWinTokens(newClawMachine)
5833
}

0 commit comments

Comments
 (0)