11package eu .sim642 .adventofcode2024
22
3+ import eu .sim642 .adventofcodelib .IntegralImplicits ._
4+
35object 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