Skip to content

Commit a47d3f2

Browse files
committed
Deduplicate parts in 2024 day 7
1 parent bd44e54 commit a47d3f2

File tree

1 file changed

+25
-26
lines changed
  • src/main/scala/eu/sim642/adventofcode2024

1 file changed

+25
-26
lines changed

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

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package eu.sim642.adventofcode2024
22

3+
import eu.sim642.adventofcodelib.IntegralImplicits._
4+
35
object Day7 {
46

57
case class Equation(testValue: Long, numbers: Seq[Int])
@@ -15,47 +17,44 @@ object Day7 {
1517
}
1618
}
1719

18-
object Part1 extends Part {
19-
override def isSolvable(equation: Equation): Boolean = {
20+
def unAdd(testValue: Long, number: Int): Option[Long] =
21+
if (testValue > number) Some(testValue - number) else None
2022

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-
}
23+
def unMultiply(testValue: Long, number: Int): Option[Long] = testValue /! number
2724

28-
helper(equation.testValue, equation.numbers.view.reverse.toList)
29-
}
25+
def unConcatenate(testValue: Long, number: Int): Option[Long] = {
26+
val testValueStr = testValue.toString
27+
val numberStr = number.toString
28+
if (testValueStr.length > numberStr.length && testValueStr.endsWith(numberStr))
29+
Some(testValueStr.dropRight(numberStr.length).toLong)
30+
else
31+
None
3032
}
3133

32-
object Part2 extends Part {
34+
trait RightToLeftPart extends Part {
35+
val unOperators: Seq[(Long, Int) => Option[Long]]
36+
3337
override def isSolvable(equation: Equation): Boolean = {
3438

3539
def helper(testValue: Long, numbers: List[Int]): Boolean = numbers match {
36-
case Nil => ???
40+
case Nil => throw new IllegalAccessException("illegal empty equation")
3741
case List(number) => number == testValue
3842
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
43+
unOperators.exists(_(testValue, number).exists(helper(_, newNumbers)))
5344
}
5445

5546
helper(equation.testValue, equation.numbers.view.reverse.toList)
5647
}
5748
}
5849

50+
object Part1 extends RightToLeftPart {
51+
override val unOperators: Seq[(Long, Int) => Option[Long]] = Seq(unMultiply, unAdd)
52+
}
53+
54+
object Part2 extends RightToLeftPart {
55+
override val unOperators: Seq[(Long, Int) => Option[Long]] = Seq(unMultiply, unAdd, unConcatenate)
56+
}
57+
5958
def parseEquation(s: String): Equation = s match {
6059
case s"$testValue: $numbers" =>
6160
Equation(testValue.toLong, numbers.split(" ").map(_.toInt).toSeq)

0 commit comments

Comments
 (0)