@@ -6,19 +6,35 @@ object Day2 {
66
77 type Range = Interval
88
9- val invalidIds : LazyList [Long ] = LazyList .from(1 ).map(i =>
10- val len = i.toString.length // TODO: already have a (better) way to get number of digits?
11- i * (Math .powExact(10L , len) + 1 )
9+ def numDigits (i : Long ): Int = {
10+ i.toString.length // TODO: already have a (better) way to get number of digits?
11+ }
12+
13+ def invalidIds (times : Int ): LazyList [Long ] = LazyList .from(1 ).map(i =>
14+ val pow = Math .powExact(10L , numDigits(i))
15+ val pattern = (1 until times).foldLeft(1L )((acc, _) => pow * acc + 1 )
16+ i * pattern
1217 )
1318
14- def sumInvalidIds (ranges : Seq [Range ]): Long = { // TODO: Long?
15- val max = ranges.map(_.max).max
16- invalidIds
17- .takeWhile(_ <= max)
18- .filter(id =>
19- ranges.exists(_.contains(id))
20- )
21- .sum
19+ trait Part {
20+ def maxTimes (max : Long ): Int
21+
22+ def sumInvalidIds (ranges : Seq [Range ]): Long = {
23+ val max = ranges.map(_.max).max
24+ (for {
25+ times <- 2 to maxTimes(max) // TODO: bad shadowing
26+ id <- invalidIds(times).takeWhile(_ <= max)
27+ if ranges.exists(_.contains(id))
28+ } yield id).toSet.sum // toSet because some IDs can be created multiple ways (2222 is 2-2-2-2 and 22-22), but shouldn't count multiple times
29+ }
30+ }
31+
32+ object Part1 extends Part {
33+ override def maxTimes (max : Long ): Int = 2
34+ }
35+
36+ object Part2 extends Part {
37+ override def maxTimes (max : Long ): Int = numDigits(max)
2238 }
2339
2440 def parseRange (s : String ): Range = s match {
@@ -30,6 +46,7 @@ object Day2 {
3046 lazy val input : String = scala.io.Source .fromInputStream(getClass.getResourceAsStream(" day2.txt" )).mkString.trim
3147
3248 def main (args : Array [String ]): Unit = {
33- println(sumInvalidIds(parseRanges(input)))
49+ println(Part1 .sumInvalidIds(parseRanges(input)))
50+ println(Part2 .sumInvalidIds(parseRanges(input)))
3451 }
3552}
0 commit comments