1
0
This commit is contained in:
Hubert Van De Walle 2020-12-11 08:06:45 +01:00
parent 34259208d5
commit b7ba2d10a7
2 changed files with 216 additions and 0 deletions

View File

@ -0,0 +1,123 @@
package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
typealias Seats = Array<CharArray>
fun Seats.deepClone(): Seats = map { it.clone() }.toTypedArray()
operator fun Seats.get(x: Int, y: Int): Char = this[y][x]
operator fun Seats.set(x: Int, y: Int, value: Char) {
this[y][x] = value
}
operator fun Seats.contains(xy: Pair<Int, Int>): Boolean {
val (x, y) = xy
return x in 0 until width && y in 0 until height
}
val Seats.width get() = first().size
val Seats.height get() = size
fun Seats.asGridString() = joinToString("\n") { it.joinToString("") }
fun Seats.countOccupied() = sumBy { it.count { it == '#' } }
@Day(11)
class Day11(@Lines val input: Input<List<String>>) {
private val seats: Seats = input.value.map { it.toCharArray() }.toTypedArray()
private val directions = listOf(
-1 to -1,
+0 to -1,
+1 to -1,
+1 to +0,
+1 to +1,
+0 to +1,
-1 to +1,
-1 to +0,
)
private fun countAdjacentOccupiedSeats(x: Int, y: Int, seats: Array<CharArray>): Int =
directions.mapNotNull { (dx, dy) ->
val xx = x + dx
val yy = y + dy
if (xx to yy in seats) seats[xx, yy]
else null
}.count { it == '#' }
private fun countVisibleOccupiedSeats(x: Int, y: Int, seats: Seats): Int {
var occupied = 0
for ((dx, dy) in directions) {
var xx = x
var yy = y
while (true) {
xx += dx
yy += dy
if (xx to yy !in seats) break
if (seats[xx, yy] == 'L') break
if (seats[xx, yy] == '#') {
occupied++
break
}
}
}
return occupied
}
private fun findLastRepeating(seats: Seats, next: (Seats) -> Seats): Seats {
var previous = seats
val set = HashSet<String>() // use strings because Arrays don't implement equals ??
while (true) {
val res = next(previous)
if (!set.add(res.asGridString())) return res
previous = res
}
}
private fun progress1(previous: Array<CharArray>): Array<CharArray> {
val next = previous.deepClone()
for (x in 0 until seats.width) {
for (y in 0 until seats.height) {
when (previous[x, y]) {
'L' -> if (countAdjacentOccupiedSeats(x, y, previous) == 0) next[x, y] = '#'
'#' -> if (countAdjacentOccupiedSeats(x, y, previous) >= 4) next[x, y] = 'L'
}
}
}
return next
}
fun part1() = findLastRepeating(seats, ::progress1).countOccupied()
private fun progress2(previous: Seats): Array<CharArray> {
val next = previous.deepClone()
for (x in 0 until previous.width) {
for (y in 0 until previous.height) {
when (previous[x, y]) {
'L' -> if (countVisibleOccupiedSeats(x, y, previous) == 0) next[x, y] = '#'
'#' -> if (countVisibleOccupiedSeats(x, y, previous) >= 5) next[x, y] = 'L'
}
}
}
return next
}
fun part2() = findLastRepeating(seats, ::progress2).countOccupied()
}
fun main() = with(createDay<Day11>()) {
println(part1())
println(part2())
}

View File

@ -0,0 +1,93 @@
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLL.LLLLLL.LL.LLLL.LLLLLL.LLLLLLL
LL.LLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LL.LLLL.LLLLLL.LLLLLLL
LLLLLL.LLLLLLLLLLLLLLLL.LLL.L.LLLLLLLL.LLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLL.L.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
L.L....L...L..LLLLLL.L.LLL..L...L.....L.L...L..L.LL.....L..L..LL...L........L..LLLLLLL.L......L..
LLLLLLLLLL.LLLLLLLL.LLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLLLLLL.LLLL..LLLLLLLL.LL.LLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLL.LLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.L.LLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLL..L.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL
LLLLLLL.LLLLLLL.LLLLLLL.LLLLL.LLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLL.LL.LLLLLLLL.LLLLLLLL...LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL..LLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLL
..L...L..LL.L....LL.L...LLLL......L...L....L...L.L...L..L..L...L.....L..L...................LLL.L
LLLLLLLLLLLL.LLLLLLL.LL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLL.LLLLLLL
LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLLLL.LLLLLLLLLLL.LLLL..LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LL..LL.....LLL......LL.........L...L..L......L.....LL........LLLL.....L..................LL....L.
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLL.LLLLLLL.LLLLLLL
LLLLLLLLLLLLLLLLLLL.LLL.LLL.L.LLLLLLLLLLLLLLLLLL.LL.L.L.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
LL.LLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLL.LL.LLLLLL.
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
.LLLLLLLLLLLL.L.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL
...L..L...L.....L....LL..L.....L.L..L...LLLL..L....LL.L....L.L.L......LL...L...L..LLLL.L..L......
LLLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLL...LLL.LLLLL.LLL.LLL.LLLLL..LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLL.LLLLLLL
LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LL.LL.LLL.LLLLL..LLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL
L.LLLLLLLLLLL.L..LLLLLL.LLLLL.LLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
.L....LL....L......LLL...L..L..L.L.L.LLL.L.L........L....L..LL......L......L.L..LLLL.L.L..L......
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL..LLLLLLL..LL.LLLLLLLLLL
LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL..LLL.LLLLL.L.LL.LL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL
LLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.L.LLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLL
LLLLLL.....L......L.......L..L.LLL...L.L...LLL....L.......L.L..L...LL....LL.L...L...LLL.L...L..LL
LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLLL
LLLLLLLLLLLLLLL.LL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL
LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLL
....L..L.L.L...L.....L...LLL.....L.......L..LLL.LL...L.....L..L.L...L.L.L...LL...LL.L....LL.....L
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLL.LLL.LLL
LLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLL.LLLLLL..LLLLLLLLLLLLLL
LL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLL..LLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLL.LL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.L.LLLLL
LLL.LLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LL.LLLLLL..LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LL.L
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL
......L......LLL......L.LL...L..L.L.L..L.L.......L.L....L..LL.......L......L.....L.LLLLLL...L...L
LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLL..L.L.LLLLL
LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL
LLLLLLLLLL.LLLL.LLLLL.L.LLL.L.LLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL..LLLLL.LLLLLLL
LL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL
.LLLLL.LLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLL.LL.L.LLLL.L.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL
LLLLLLLLLL.LLLLLLLLLLLL.LLLL..LLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.L.LLLLLLL.L.LLLLL.LLLLLL.LLLLLLL
.L....L...L..LL.....L.LL...L.L..LLL...L..L..L..L..L.LLLLL....LLLL.........L..L..L..L..L...LL....L
LLLLLLLLLL.LLLL.LLLLLLL.LLLL..LLLLLLLLLLLLLLLLL..L.LLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLL.LLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL..LLLL
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL
LL.LLLLLLLLLLLL.LLLLLLL.LLLLL.LLLL.L.L.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLL.LLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
..L.L...L.L........L.......L......LLLLL......L.LLL.LL.........L.L....L..L.L.L...L..LL.L......LL..
LLLLLLLLLL.LL.L.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LL.LLLLLLL.LLLLLL.LLLLLLL
LLL.LLLLLLLLL.L.LLLLLLL.LLLLLLLLLLLL.L.LLLLLLLL..LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL.L.LLLLLLLLLLLLL.
LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.L.LLLLLL.LL.LLLLLL.LLLLLLL.LL.LLL.LLLLLLL
LLLLLLLLLLLLLLLLLLLLLLL.LL.LL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL
LLLLLLLLLL.LLLLLLLLLL.L.LLLLL.LLLLLLLL.LLLLLLLLL.LLL.LL.LLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL
LLLLLLLL.L.LLLL.LLLLLLL.LLLL..LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLL.LL
.....LL.L...L..L.L..LL.L.......L...L...LLL.L.L..L.LL.L...LL..L.LL.LLL......LL.L..L.LL......L.....
LLL.LLLLLL.LLLLLLLLLLLL.LLLLLL..LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLL..L
LLLLLLLLLL.LLLL.LLLLL.L.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.L..LLLLLL.LLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLL..LLLLLLL.LLLLL.LLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.L.LLLLL.LLLLLLLL.LLLLLLL
LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLL
LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LL.LLLLLLLLLLLL.LLLLLLL.LLLL..LLLLLLL..LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL
LLLLLLLL.L.LLLLLLLLLLLL.LLLLLLLLLLLLL..LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLL
LLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLL.L.LLLLLLLLL.LLLLLLL.LL.LLL.LLLLLLL
LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL
LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLLL.LLLLL.LLLLLL.L.LLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LL.LLLLLL.