day(11): add solution
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
5a2ca59ee1
commit
20016a3582
2 changed files with 98 additions and 0 deletions
88
src/year2021/day11/Day11.kt
Normal file
88
src/year2021/day11/Day11.kt
Normal file
|
@ -0,0 +1,88 @@
|
|||
package year2021.day11
|
||||
|
||||
import readInput
|
||||
import kotlin.collections.ArrayDeque
|
||||
|
||||
fun validAdjacentIndices(input: List<List<Int>>, y0: Int, x0: Int): Iterable<Pair<Int, Int>> =
|
||||
(y0 - 1..y0 + 1)
|
||||
.flatMap { y -> (x0 - 1..x0 + 1).map { x -> Pair(y, x) } }
|
||||
.filter { (y, x) ->
|
||||
(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>> =
|
||||
(octopuses.indices)
|
||||
.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 {
|
||||
// First, the energy level of each octopus increases by 1.
|
||||
for (y in octopuses.indices) {
|
||||
for (x in octopuses.indices) {
|
||||
octopuses[y][x]++
|
||||
}
|
||||
}
|
||||
|
||||
// Then, any octopus with an energy level greater than 9 flashes.
|
||||
val queue = ArrayDeque(getFlashes(octopuses))
|
||||
while (queue.isNotEmpty()) {
|
||||
val (y, x) = queue.removeFirst()
|
||||
|
||||
for ((y_1, x_1) in validAdjacentIndices(octopuses, y, x)) {
|
||||
octopuses[y_1][x_1]++
|
||||
|
||||
// == 10 means we made it flash
|
||||
if (octopuses[y_1][x_1] == 10) {
|
||||
queue.addLast(Pair(y_1, x_1))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Count the flashing octopuses.
|
||||
val flashes = octopuses.sumOf { row -> row.count { it > 9 } }
|
||||
|
||||
// Reset energy level.
|
||||
for (y in octopuses.indices) {
|
||||
for (x in octopuses.indices) {
|
||||
if (octopuses[y][x] > 9) {
|
||||
octopuses[y][x] = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return flashes
|
||||
}
|
||||
|
||||
fun part1(input: List<List<Int>>): Int {
|
||||
var flashes = 0
|
||||
val octopuses = input.map { row -> row.toMutableList() }.toMutableList()
|
||||
|
||||
repeat(100) {
|
||||
flashes += step(octopuses)
|
||||
}
|
||||
|
||||
return flashes
|
||||
}
|
||||
|
||||
fun part2(input: List<List<Int>>): Int {
|
||||
var i = 1
|
||||
val octopuses = input.map { row -> row.toMutableList() }.toMutableList()
|
||||
val count = octopuses.size * octopuses[0].size
|
||||
|
||||
while (step(octopuses) != count) {
|
||||
i++
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
||||
fun main() {
|
||||
val sample = readInput(11, "sample").map { row -> row.map { it.digitToInt() } }
|
||||
val input = readInput(11, "input").map { row -> row.map { it.digitToInt() } }
|
||||
|
||||
check(part1(sample) == 1656)
|
||||
println(part1(input))
|
||||
|
||||
check(part2(sample) == 195)
|
||||
println(part2(input))
|
||||
}
|
10
src/year2021/day11/sample.txt
Normal file
10
src/year2021/day11/sample.txt
Normal file
|
@ -0,0 +1,10 @@
|
|||
5483143223
|
||||
2745854711
|
||||
5264556173
|
||||
6141336146
|
||||
6357385478
|
||||
4167524645
|
||||
2176841721
|
||||
6882881134
|
||||
4846848554
|
||||
5283751526
|
Loading…
Reference in a new issue