Skip to content

Commit bd44e54

Browse files
committed
Solve 2024 day 7 part 2
1 parent a7910af commit bd44e54

File tree

2 files changed

+59
-15
lines changed

2 files changed

+59
-15
lines changed

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

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,56 @@ object Day7 {
44

55
case class Equation(testValue: Long, numbers: Seq[Int])
66

7-
def isSolvable(equation: Equation): Boolean = {
7+
trait Part {
8+
def isSolvable(equation: Equation): Boolean
89

9-
def helper(testValue: Long, numbers: List[Int]): Boolean = numbers match {
10-
case Nil => ???
11-
case List(number) => number == testValue
12-
case number :: numbers =>
13-
testValue % number == 0 && helper(testValue / number, numbers) || helper(testValue - number, numbers)
10+
def totalCalibrationResult(equations: Seq[Equation]): Long = {
11+
equations
12+
.filter(isSolvable)
13+
.map(_.testValue)
14+
.sum
1415
}
16+
}
17+
18+
object Part1 extends Part {
19+
override def isSolvable(equation: Equation): Boolean = {
1520

16-
helper(equation.testValue, equation.numbers.view.reverse.toList)
21+
def helper(testValue: Long, numbers: List[Int]): Boolean = numbers match {
22+
case Nil => ???
23+
case List(number) => number == testValue
24+
case number :: numbers =>
25+
testValue % number == 0 && helper(testValue / number, numbers) || helper(testValue - number, numbers)
26+
}
27+
28+
helper(equation.testValue, equation.numbers.view.reverse.toList)
29+
}
1730
}
1831

19-
def totalCalibrationResult(equations: Seq[Equation]): Long = {
20-
equations
21-
.filter(isSolvable)
22-
.map(_.testValue)
23-
.sum
32+
object Part2 extends Part {
33+
override def isSolvable(equation: Equation): Boolean = {
34+
35+
def helper(testValue: Long, numbers: List[Int]): Boolean = numbers match {
36+
case Nil => ???
37+
case List(number) => number == testValue
38+
case number :: newNumbers =>
39+
testValue % number == 0 && helper(testValue / number, newNumbers) || helper(testValue - number, newNumbers) || concatHelper(testValue, numbers)
40+
}
41+
42+
def concatHelper(testValue: Long, numbers: List[Int]): Boolean = numbers match {
43+
case number :: newNumbers =>
44+
val testValueStr = testValue.toString
45+
val numberStr = number.toString
46+
if (testValueStr.length > numberStr.length && testValueStr.endsWith(numberStr)) {
47+
val newTestValue = testValueStr.dropRight(numberStr.length).toLong
48+
helper(newTestValue, newNumbers)
49+
}
50+
else
51+
false
52+
case _ => false
53+
}
54+
55+
helper(equation.testValue, equation.numbers.view.reverse.toList)
56+
}
2457
}
2558

2659
def parseEquation(s: String): Equation = s match {
@@ -33,6 +66,7 @@ object Day7 {
3366
lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day7.txt")).mkString.trim
3467

3568
def main(args: Array[String]): Unit = {
36-
println(totalCalibrationResult(parseInput(input)))
69+
println(Part1.totalCalibrationResult(parseInput(input)))
70+
println(Part2.totalCalibrationResult(parseInput(input)))
3771
}
3872
}

src/test/scala/eu/sim642/adventofcode2024/Day7Test.scala

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,20 @@ class Day7Test extends AnyFunSuite {
1717
|292: 11 6 16 20""".stripMargin
1818

1919
test("Part 1 examples") {
20-
assert(totalCalibrationResult(parseInput(exampleInput)) == 3749)
20+
assert(Part1.totalCalibrationResult(parseInput(exampleInput)) == 3749)
2121
}
2222

2323
test("Part 1 input answer") {
24-
assert(totalCalibrationResult(parseInput(input)) == 1620690235709L)
24+
assert(Part1.totalCalibrationResult(parseInput(input)) == 1620690235709L)
25+
}
26+
27+
test("Part 2 examples") {
28+
assert(Part2.isSolvable(parseEquation("7290: 6 8 6 15")))
29+
30+
assert(Part2.totalCalibrationResult(parseInput(exampleInput)) == 11387)
31+
}
32+
33+
test("Part 2 input answer") {
34+
assert(Part2.totalCalibrationResult(parseInput(input)) == 145397611075341L)
2535
}
2636
}

0 commit comments

Comments
 (0)