@@ -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}
0 commit comments