@@ -2,51 +2,73 @@ package eu.sim642.adventofcode2024
22
33import eu .sim642 .adventofcodelib .graph .{Dijkstra , GraphSearch , TargetNode }
44import eu .sim642 .adventofcodelib .pos .Pos
5- import eu .sim642 .adventofcodelib .IntegralImplicits ._
5+ import eu .sim642 .adventofcodelib .IntegralImplicits .*
6+ import eu .sim642 .adventofcodelib .NumberTheory
67
78object Day13 {
89
9- case class ClawMachine ( buttonA : Pos , buttonB : Pos , prize : Pos )
10+ case class LongPos ( x : Long , y : Long )
1011
11- def minWinTokens (clawMachine : ClawMachine ): Int = {
12- val ClawMachine (buttonA, buttonB, prize) = clawMachine
12+ case class ClawMachine (buttonA : Pos , buttonB : Pos , prize : LongPos )
1313
14- /* val graphSearch = new GraphSearch[Pos] with TargetNode[Pos] {
15- override val startNode: Pos = Pos.zero
14+ trait Part {
15+ def minWinTokens ( clawMachine : ClawMachine ) : Long
1616
17- override def neighbors(pos: Pos): IterableOnce[(Pos, Int)] = {
18- for {
19- (button, tokens) <- Seq(clawMachine.buttonA -> 3, clawMachine.buttonB -> 1)
20- newPos = pos + button
21- if newPos <= targetNode
22- } yield newPos -> tokens
17+ def sumMinWinTokens (clawMachines : Seq [ClawMachine ]): Long = clawMachines.map(minWinTokens).sum
18+ }
19+
20+ object Part1 extends Part {
21+ override def minWinTokens (clawMachine : ClawMachine ): Long = {
22+ 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
2336 }
2437
25- override val targetNode: Pos = clawMachine.prize
26- }
38+ Dijkstra.search(graphSearch).target.map(_._2).getOrElse(0)*/
2739
28- Dijkstra.search(graphSearch).target.map(_._2).getOrElse(0)*/
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)*/
2946
30- (for {
31- timesA <- 0 to 100
32- prizeB = prize - timesA *: buttonA
33- timesB <- prizeB.x /! buttonB.x
34- if timesB * buttonB.y == prizeB.y
35- } yield 3 * timesA + timesB).minOption.getOrElse(0 )
47+ (for {
48+ timesB <- (prize.x * buttonA.y - prize.y * buttonA.x) /! (buttonB.x * buttonA.y - buttonB.y * buttonA.x)
49+ timesA <- (prize.x - timesB * buttonB.x) /! buttonA.x
50+ } yield 3 * timesA + timesB).getOrElse(0 )
51+ }
3652 }
3753
38- def sumMinWinTokens (clawMachines : Seq [ClawMachine ]): Int = clawMachines.map(minWinTokens).sum
54+ object Part2 extends Part {
55+ override def minWinTokens (clawMachine : ClawMachine ): Long = {
56+ val newClawMachine = clawMachine.copy(prize = LongPos (clawMachine.prize.x + 10000000000000L , clawMachine.prize.y + 10000000000000L ))
57+ Part1 .minWinTokens(newClawMachine)
58+ }
59+ }
3960
4061 def parseClawMachine (s : String ): ClawMachine = s match {
4162 case s " Button A: X+ $aX, Y+ $aY\n Button B: X+ $bX, Y+ $bY\n Prize: X= $pX, Y= $pY" =>
42- ClawMachine (Pos (aX.toInt, aY.toInt), Pos (bX.toInt, bY.toInt), Pos (pX.toInt , pY.toInt ))
63+ ClawMachine (Pos (aX.toInt, aY.toInt), Pos (bX.toInt, bY.toInt), LongPos (pX.toLong , pY.toLong ))
4364 }
4465
4566 def parseClawMachines (input : String ): Seq [ClawMachine ] = input.split(" \n\n " ).map(parseClawMachine).toSeq
4667
4768 lazy val input : String = scala.io.Source .fromInputStream(getClass.getResourceAsStream(" day13.txt" )).mkString.trim
4869
4970 def main (args : Array [String ]): Unit = {
50- println(sumMinWinTokens(parseClawMachines(input)))
71+ println(Part1 .sumMinWinTokens(parseClawMachines(input)))
72+ println(Part2 .sumMinWinTokens(parseClawMachines(input)))
5173 }
5274}
0 commit comments