Skip to content

Commit 0789f4f

Browse files
committed
Improve solution 2025-04 (Printing Department)
* Avoid marking paper rolls makes the code cleaner but loses the ability to print the grid's state with paper rolls to be removed. * We don't need a new grid for each iteration.
1 parent e182d68 commit 0789f4f

File tree

1 file changed

+15
-30
lines changed

1 file changed

+15
-30
lines changed
Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,39 @@
11
package de.ronny_h.aoc.year2025.day04
22

33
import de.ronny_h.aoc.AdventOfCode
4-
import de.ronny_h.aoc.extensions.asList
54
import de.ronny_h.aoc.extensions.grids.SimpleCharGrid
65
import de.ronny_h.aoc.year2025.day04.PaperGrid.Companion.EMPTY
7-
import de.ronny_h.aoc.year2025.day04.PaperGrid.Companion.MARKED_PAPER
86

97
fun main() = PrintingDepartment().run(1397, 8758)
108

119
class PrintingDepartment : AdventOfCode<Int>(2025, 4) {
12-
override fun part1(input: List<String>): Int = PaperGrid(input).countAndMarkAccessiblePaperRolls()
10+
override fun part1(input: List<String>): Int = PaperGrid(input).accessiblePaperRollsCoordinates().count()
1311

1412
override fun part2(input: List<String>): Int {
15-
var paperGrid = PaperGrid(input)
13+
val grid = PaperGrid(input)
1614
var total = 0
17-
var accessiblePaperRolls = paperGrid.countAndMarkAccessiblePaperRolls()
18-
while (accessiblePaperRolls > 0) {
19-
total += accessiblePaperRolls
20-
paperGrid = paperGrid.copyReplacing(MARKED_PAPER, EMPTY)
21-
accessiblePaperRolls = paperGrid.countAndMarkAccessiblePaperRolls()
15+
while (true) {
16+
grid.accessiblePaperRollsCoordinates().toList().apply {
17+
if (isEmpty()) return total
18+
forEach { grid[it] = EMPTY }
19+
total += size
20+
}
2221
}
23-
return total
2422
}
25-
2623
}
2724

2825
class PaperGrid(input: List<String>) : SimpleCharGrid(input, EMPTY) {
2926

3027
companion object {
3128
private const val PAPER = '@'
32-
const val MARKED_PAPER = 'x'
3329
const val EMPTY = '.'
3430
}
3531

36-
fun countAndMarkAccessiblePaperRolls() =
37-
forEachCoordinates { position, element ->
38-
if (element.isAPaperRoll() && position.neighboursIncludingDiagonals()
39-
.count { this[it].isAPaperRoll() } < 4
40-
) {
41-
this[position] = MARKED_PAPER
42-
1
43-
} else {
44-
0
45-
}
46-
}.sum()
47-
48-
fun copyReplacing(oldElement: Char, newElement: Char): PaperGrid {
49-
val newGridString = toString().replace(oldElement, newElement)
50-
return PaperGrid(newGridString.asList())
51-
}
52-
53-
private fun Char.isAPaperRoll(): Boolean = this == PAPER || this == MARKED_PAPER
32+
fun accessiblePaperRollsCoordinates() = forEachCoordinates { position, element ->
33+
if (element == PAPER && position.neighboursIncludingDiagonals().count { this[it] == PAPER } < 4) {
34+
position
35+
} else {
36+
null
37+
}
38+
}.filterNotNull()
5439
}

0 commit comments

Comments
 (0)