Skip to content

Commit 8b40369

Browse files
authored
Day 05 2025 (#299)
1 parent d5467a1 commit 8b40369

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package me.peckb.aoc._2025.calendar.day05
2+
3+
import javax.inject.Inject
4+
import me.peckb.aoc.generators.InputGenerator.InputGeneratorFactory
5+
import kotlin.math.max
6+
import kotlin.math.min
7+
8+
class Day05 @Inject constructor(
9+
private val generatorFactory: InputGeneratorFactory,
10+
) {
11+
fun partOne(filename: String) = generatorFactory.forFile(filename).read { input ->
12+
val (ranges, inventory) = parseInput(input)
13+
14+
inventory.count { ranges.any { r -> r.contains(it) } }
15+
}
16+
17+
fun partTwo(filename: String) = generatorFactory.forFile(filename).read { input ->
18+
val (ranges, _) = parseInput(input)
19+
20+
do {
21+
val overlap = ranges.firstNotNullOfOrNull { r1 ->
22+
ranges.firstOrNull { it != r1 && it.overlaps(r1) }?.let { it to r1 }
23+
}
24+
25+
overlap?.let { (r1, r2) ->
26+
ranges.remove(r1)
27+
ranges.remove(r2)
28+
ranges.add(min(r1.first, r2.first)..max(r1.last, r2.last))
29+
}
30+
} while (overlap != null)
31+
32+
ranges.distinct().sumOf { it.last - it.first + 1 }
33+
}
34+
35+
private fun parseInput(input: Sequence<String>): Pair<MutableList<LongRange>, MutableList<Long>> {
36+
val ranges = mutableListOf<LongRange>()
37+
val inventory = mutableListOf<Long>()
38+
var findingRanges = true
39+
input.forEach { line ->
40+
if (line.isEmpty()) {
41+
findingRanges = false
42+
} else {
43+
if (findingRanges) {
44+
line.split("-").let { (s, e) -> ranges.add(s.toLong()..e.toLong()) }
45+
} else {
46+
inventory.add(line.toLong())
47+
}
48+
}
49+
}
50+
51+
return ranges to inventory
52+
}
53+
54+
infix fun LongRange.overlaps(other: LongRange): Boolean {
55+
return this.first <= other.last && other.first <= this.last
56+
}
57+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
## [Day 5: Cafeteria](https://adventofcode.com/2025/day/5)

src/test/kotlin/me/peckb/aoc/_2025/TestDayComponent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import dagger.Component
44
import me.peckb.aoc._2025.calendar.day02.Day02Test
55
import me.peckb.aoc._2025.calendar.day03.Day03Test
66
import me.peckb.aoc._2025.calendar.day04.Day04Test
7+
import me.peckb.aoc._2025.calendar.day05.Day05Test
78
import javax.inject.Singleton
89
import me.peckb.aoc.DayComponent
910
import me.peckb.aoc.InputModule
@@ -16,4 +17,5 @@ internal interface TestDayComponent : DayComponent {
1617
fun inject(day02Test: Day02Test)
1718
fun inject(day03Test: Day03Test)
1819
fun inject(day04Test: Day04Test)
20+
fun inject(day05Test: Day05Test)
1921
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package me.peckb.aoc._2025.calendar.day05
2+
3+
import javax.inject.Inject
4+
5+
import me.peckb.aoc._2025.DaggerTestDayComponent
6+
import org.junit.jupiter.api.Assertions.assertEquals
7+
import org.junit.jupiter.api.BeforeEach
8+
import org.junit.jupiter.api.Test
9+
10+
internal class Day05Test {
11+
@Inject
12+
lateinit var day05: Day05
13+
14+
@BeforeEach
15+
fun setup() {
16+
DaggerTestDayComponent.create().inject(this)
17+
}
18+
19+
@Test
20+
fun testDay05PartOne() {
21+
assertEquals(798, day05.partOne(DAY_05))
22+
}
23+
24+
@Test
25+
fun testDay05PartTwo() {
26+
assertEquals(366181852921027, day05.partTwo(DAY_05))
27+
}
28+
29+
companion object {
30+
private const val DAY_05: String = "advent-of-code-input/2025/day05.input"
31+
}
32+
}

0 commit comments

Comments
 (0)