This commit is contained in:
Paul-Henri Froidmont 2024-12-15 05:08:21 +01:00
parent 5c0e8a2ce6
commit ddaa007102
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
2 changed files with 1325 additions and 0 deletions

1279
input/day13 Normal file

File diff suppressed because it is too large Load diff

46
src/day13.scala Normal file
View file

@ -0,0 +1,46 @@
package aoc
package day13
val dayNumber = "13"
@main def part1: Unit =
println(part1(loadInput(dayNumber)))
@main def part2: Unit =
println(part2(loadInput(dayNumber)))
def part1(input: String): String =
val machines = parseInput(input)
machines.flatMap(_.tokenCost).sum.toString
def part2(input: String): String =
val correction = 10000000000000L
val machines = parseInput(input)
.map(m => m.copy(x = m.x + correction, y = m.y + correction))
machines.flatMap(_.tokenCost).sum.toString
case class Machine(ax: Long, ay: Long, bx: Long, by: Long, x: Long, y: Long):
def tokenCost: Option[Long] =
// Calculations come from solving the given equations
// a * ax + b * bx == x
// a * ay + b * by == y
val b = (x * ay - y * ax) / (bx * ay - by * ax).toDouble
val a = (x - b * bx) / ax.toDouble
Option.when(a.isWhole && b.isWhole)(a.toLong * 3 + b.toLong)
def parseInput(input: String): List[Machine] =
object l:
def unapply(s: String): Option[Long] = s.toLongOption
input
.split("\n\n")
.map(_.split("\n").toList)
.flatMap {
case List(
s"Button A: X+${l(ax)}, Y+${l(ay)}",
s"Button B: X+${l(bx)}, Y+${l(by)}",
s"Prize: X=${l(x)}, Y=${l(y)}"
) =>
Some(Machine(ax, ay, bx, by, x, y))
case _ => None
}
.toList