day(11): refactor some more
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
dbc8b26446
commit
f4466c9a88
1 changed files with 14 additions and 19 deletions
|
@ -1,7 +1,6 @@
|
||||||
package year2021.day11
|
package year2021.day11
|
||||||
|
|
||||||
import readInput
|
import readInput
|
||||||
import kotlin.collections.ArrayDeque
|
|
||||||
|
|
||||||
fun validAdjacentIndices(input: List<List<Int>>, y0: Int, x0: Int): Iterable<Pair<Int, Int>> =
|
fun validAdjacentIndices(input: List<List<Int>>, y0: Int, x0: Int): Iterable<Pair<Int, Int>> =
|
||||||
(y0 - 1..y0 + 1)
|
(y0 - 1..y0 + 1)
|
||||||
|
@ -10,22 +9,20 @@ fun validAdjacentIndices(input: List<List<Int>>, y0: Int, x0: Int): Iterable<Pai
|
||||||
(y != y0 || x != x0) && (y >= 0 && y < input.size) && (x >= 0 && x < input[y].size)
|
(y != y0 || x != x0) && (y >= 0 && y < input.size) && (x >= 0 && x < input[y].size)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getFlashes(octopuses: MutableList<MutableList<Int>>): List<Pair<Int, Int>> =
|
fun allIndices(octopuses: List<List<Int>>): Iterable<Pair<Int, Int>> =
|
||||||
(octopuses.indices)
|
octopuses.indices.flatMap { y -> octopuses[y].indices.map { x -> y to x } }
|
||||||
.flatMap { y -> octopuses[y].indices.map { x -> Pair(y, x) } }
|
|
||||||
.filter { (y, x) -> octopuses[y][x] > 9 }
|
|
||||||
.toList()
|
|
||||||
|
|
||||||
fun step(octopuses: MutableList<MutableList<Int>>): Int {
|
fun getFlashes(octopuses: List<List<Int>>): Iterable<Pair<Int, Int>> =
|
||||||
|
allIndices(octopuses).filter { (y, x) -> octopuses[y][x] > 9 }
|
||||||
|
|
||||||
|
fun step(octopuses: List<MutableList<Int>>): Int {
|
||||||
// First, the energy level of each octopus increases by 1.
|
// First, the energy level of each octopus increases by 1.
|
||||||
for (y in octopuses.indices) {
|
for ((y, x) in allIndices(octopuses)) {
|
||||||
for (x in octopuses.indices) {
|
|
||||||
octopuses[y][x]++
|
octopuses[y][x]++
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Then, any octopus with an energy level greater than 9 flashes.
|
// Then, any octopus with an energy level greater than 9 flashes.
|
||||||
val queue = ArrayDeque(getFlashes(octopuses))
|
val queue = ArrayDeque(getFlashes(octopuses).toList())
|
||||||
while (queue.isNotEmpty()) {
|
while (queue.isNotEmpty()) {
|
||||||
val (y, x) = queue.removeFirst()
|
val (y, x) = queue.removeFirst()
|
||||||
|
|
||||||
|
@ -43,24 +40,22 @@ fun step(octopuses: MutableList<MutableList<Int>>): Int {
|
||||||
val flashes = octopuses.sumOf { row -> row.count { it > 9 } }
|
val flashes = octopuses.sumOf { row -> row.count { it > 9 } }
|
||||||
|
|
||||||
// Reset energy level.
|
// Reset energy level.
|
||||||
for (y in octopuses.indices) {
|
for ((y, x) in allIndices(octopuses)) {
|
||||||
for (x in octopuses.indices) {
|
|
||||||
if (octopuses[y][x] > 9) {
|
if (octopuses[y][x] > 9) {
|
||||||
octopuses[y][x] = 0
|
octopuses[y][x] = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return flashes
|
return flashes
|
||||||
}
|
}
|
||||||
|
|
||||||
fun part1(input: List<List<Int>>): Int {
|
fun part1(input: List<List<Int>>): Int {
|
||||||
val octopuses = input.map { row -> row.toMutableList() }.toMutableList()
|
val octopuses = input.map { row -> row.toMutableList() }
|
||||||
return (1..100).sumOf { step(octopuses) }
|
return (1..100).sumOf { step(octopuses) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun part2(input: List<List<Int>>): Int {
|
fun part2(input: List<List<Int>>): Int {
|
||||||
val octopuses = input.map { row -> row.toMutableList() }.toMutableList()
|
val octopuses = input.map { row -> row.toMutableList() }
|
||||||
val count = octopuses.size * octopuses[0].size
|
val count = octopuses.size * octopuses[0].size
|
||||||
return (1..Int.MAX_VALUE).first { step(octopuses) == count }
|
return (1..Int.MAX_VALUE).first { step(octopuses) == count }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue