Skip to content

Commit 83ef6e4

Browse files
committed
Solve 2025 day 2 part 2
1 parent 45364b4 commit 83ef6e4

File tree

2 files changed

+39
-14
lines changed

2 files changed

+39
-14
lines changed

src/main/scala/eu/sim642/adventofcode2025/Day2.scala

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/test/scala/eu/sim642/adventofcode2025/Day2Test.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,18 @@ class Day2Test extends AnyFunSuite {
99
"""11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"""
1010

1111
test("Part 1 examples") {
12-
assert(sumInvalidIds(parseRanges(exampleInput)) == 1227775554)
12+
assert(Part1.sumInvalidIds(parseRanges(exampleInput)) == 1227775554)
1313
}
1414

1515
test("Part 1 input answer") {
16-
assert(sumInvalidIds(parseRanges(input)) == 5398419778L)
16+
assert(Part1.sumInvalidIds(parseRanges(input)) == 5398419778L)
17+
}
18+
19+
test("Part 2 examples") {
20+
assert(Part2.sumInvalidIds(parseRanges(exampleInput)) == 4174379265L)
21+
}
22+
23+
test("Part 2 input answer") {
24+
assert(Part2.sumInvalidIds(parseRanges(input)) == 15704845910L)
1725
}
1826
}

0 commit comments

Comments
 (0)