Advent of Code 2021 day 14
12/14/2022, 5:00 AMDavid Whittaker
12/14/2022, 5:25 AMKroppeb
12/14/2022, 5:27 AMDavid Whittaker
12/14/2022, 5:32 AMMichael Böiers
12/14/2022, 5:40 AMMarcin Wisniowski
12/14/2022, 5:59 AMJonathan Kolberg
12/14/2022, 6:10 AMJakub Gwóźdź
12/14/2022, 6:15 AMSergei Petunin
12/14/2022, 6:24 AMwhile(true)
instead of figuring out a proper termination condition or just rewriting everything in a functional style. But still, it works :D https://github.com/forketyfork/aoc-2022/blob/main/src/main/kotlin/year2022/Day14.ktDan Fingal-Surma
12/14/2022, 6:45 AMDan Fingal-Surma
12/14/2022, 6:46 AMprint
function for my cavewakingrufus
12/14/2022, 6:56 AMwakingrufus
12/14/2022, 6:56 AMfun part2(input: List<String>): Int {
val rocks = input.flatMap { parse(it) }
val sand = mutableSetOf<Pair<Int, Int>>()
val bottom = rocks.maxOf { it.second } + 2
var nextSand = listOf(500 to 0)
while (nextSand.isNotEmpty()) {
sand.addAll(nextSand)
nextSand = nextSand
.flatMap { it.spread() }
.toSet()
.filter { !rocks.contains(it) && !sand.contains(it) && it.second < bottom }
}
return sand.size
}
fun Pair<Int, Int>.spread(): List<Pair<Int, Int>> {
return listOf(first to second + 1, first - 1 to second + 1, first + 1 to second + 1)
}
fun parse(input: String): Set<Pair<Int, Int>> {
val pairs = input.split("->")
.map { it.trim() }
.map { it.split(",") }
.map { it[0].toInt() to it[1].toInt() }
return pairs.zipWithNext { a, b ->
(minOf(a.first, b.first)..maxOf(a.first, b.first))
.flatMap { x ->
(minOf(a.second, b.second)..maxOf(a.second, b.second))
.map { y -> x to y }
}
}
.flatten()
.toSet()
}
Michael Böiers
12/14/2022, 6:57 AMrocketraman
12/14/2022, 6:58 AMgenerateSequence { ... }.last()
to avoid the while(true)
.Michael Böiers
12/14/2022, 6:59 AMrocketraman
12/14/2022, 7:01 AMSergei Petunin
12/14/2022, 7:01 AMtakeWhile()
...rocketraman
12/14/2022, 7:02 AMwhile(true)
in mine, I had while(nextSand()) { }
with nextSand()
writing to a mutable set. Doing it as a generator gets rid of the mutable set as well as the empty while loop body, and just generates the updated set on each iteration.Michael Böiers
12/14/2022, 7:03 AMCognitive Gear
12/14/2022, 7:09 AMrocketraman
12/14/2022, 7:10 AMMichael Böiers
12/14/2022, 7:10 AMDan Fingal-Surma
12/14/2022, 7:19 AMDan Fingal-Surma
12/14/2022, 7:28 AMJakub Gwóźdź
12/14/2022, 7:29 AMMichael Böiers
12/14/2022, 7:30 AMmapNotNull(String::toIntOrNull)
works wonders 🙂ephemient
12/14/2022, 7:31 AMephemient
12/14/2022, 7:31 AMAnirudh
12/14/2022, 7:32 AMDan Fingal-Surma
12/14/2022, 7:34 AMDan Fingal-Surma
12/14/2022, 7:35 AMDan Fingal-Surma
12/14/2022, 7:35 AM......o...
.....ooo..
....XoooXX
...oXoooX.
..XXXoooX.
....ooooX.
.o.oooooX.
XXXXXXXXX.
Dan Fingal-Surma
12/14/2022, 7:35 AMAnirudh
12/14/2022, 7:36 AMDan Fingal-Surma
12/14/2022, 7:36 AMDan Fingal-Surma
12/14/2022, 7:36 AMAnirudh
12/14/2022, 7:37 AMDan Fingal-Surma
12/14/2022, 7:37 AMDan Fingal-Surma
12/14/2022, 7:38 AMDan Fingal-Surma
12/14/2022, 7:38 AMAnirudh
12/14/2022, 7:39 AMtakeLast(2).take(1)
as the starting pointDan Fingal-Surma
12/14/2022, 7:39 AMAnirudh
12/14/2022, 7:40 AMDan Fingal-Surma
12/14/2022, 7:44 AMJakub Gwóźdź
12/14/2022, 7:51 AMJakub Gwóźdź
12/14/2022, 7:53 AMAnirudh
12/14/2022, 7:56 AMDan Fingal-Surma
12/14/2022, 8:11 AMDan Fingal-Surma
12/14/2022, 8:12 AMDan Fingal-Surma
12/14/2022, 8:13 AMrkechols
12/14/2022, 8:20 AMTodor Grudev
12/14/2022, 8:21 AM0, maxY+2 -> maxX*2, maxY+2
and everything worked from part 1 😄 😄Dan Fingal-Surma
12/14/2022, 8:24 AMMichael Böiers
12/14/2022, 8:24 AMpackage aoc2022
import kotlin.math.max
import kotlin.math.min
fun main() {
data class Pos(val x: Int, val y: Int) {
fun flowTo(p: (Pos) -> Boolean) =
sequenceOf(copy(y = y + 1), copy(x = x - 1, y = y + 1), copy(x = x + 1, y = y + 1)).firstOrNull(p)
}
val rock = buildSet {
generateSequence(::readlnOrNull).forEach { row ->
row.split(" -> ").map { it.split(",").map(String::toInt) }.windowed(2).forEach { (from, to) ->
for (x in min(from[0], to[0])..max(from[0], to[0]))
for (y in min(from[1], to[1])..max(from[1], to[1])) this.add(Pos(x, y))
}
}
}
val maxY = rock.maxOf { it.y }
val source = Pos(500, 0)
val stableSand = mutableSetOf<Pos>()
var hitFloor = false
var s: Pos = source
while (source !in stableSand) {
s = s.flowTo { it.y < maxY + 2 && it !in rock && it !in stableSand } ?: source.also { stableSand += s }
if (!hitFloor && s.y == maxY + 1) {
hitFloor = true
println(stableSand.size)
}
}
println(stableSand.size)
}
rkechols
12/14/2022, 8:25 AMDan Fingal-Surma
12/14/2022, 8:26 AMDavio
12/14/2022, 8:39 AMDavio
12/14/2022, 8:40 AMDavio
12/14/2022, 8:43 AMrkechols
12/14/2022, 8:43 AMDavio
12/14/2022, 8:44 AMDan Fingal-Surma
12/14/2022, 8:54 AMval floor = Point(source.x - yMax - 3, yMax + 2).to(Point(source.x + yMax + 3, yMax + 2))
worked for me and kept nice renderingKarloti
12/14/2022, 10:10 AMephemient
12/14/2022, 11:10 AMSet<IntPair>
with BooleanArray
(and some helper accessors) gave me a pretty sizable speed boostMichael Böiers
12/14/2022, 1:06 PMpackage aoc2022
import kotlin.math.max
import kotlin.math.min
fun main() {
infix fun Int.range(i: Int) = min(this, i)..max(this, i)
val rock = generateSequence(::readlnOrNull).flatMap { row ->
row.split(" -> ", ",").map(String::toInt).windowed(4, 2).flatMap { (x1, y1, x2, y2) ->
if (x1 == x2) (y1 range y2).map { Pair(x1, it) } else (x1 range x2).map { Pair(it, y1) }
}
}.toSet()
val maxY = rock.maxOf { it.second }
val source = Pair(500, 0)
fun Pair<Int, Int>.flowTo() = let { (x, y) -> sequenceOf(x to y + 1, x - 1 to y + 1, x + 1 to y + 1) }
.filterNot { it in rock || it.second >= maxY + 2 }
val stableSand = mutableSetOf<Pair<Int, Int>>()
var reachedFloor = false
var s: Pair<Int, Int> = source
while (source !in stableSand) {
s = s.flowTo().firstOrNull { it !in stableSand } ?: source.also { stableSand += s }
if (s.second == maxY + 1 && !reachedFloor) println(stableSand.size).also { reachedFloor = true }
}
println(stableSand.size)
}
Oleksandr Balan
12/14/2022, 1:10 PMCharles Flynn
12/14/2022, 2:07 PMJintin
12/14/2022, 3:59 PMritesh
12/14/2022, 5:23 PMAlex LO
12/14/2022, 5:41 PMOleksandr Balan
12/14/2022, 6:20 PMJoakim Tall
12/14/2022, 6:37 PMJoakim Tall
12/14/2022, 6:38 PMJoakim Tall
12/14/2022, 6:38 PMrocketraman
12/14/2022, 6:46 PMphldavies
12/14/2022, 7:21 PMphldavies
12/14/2022, 7:27 PMMutableMap<Int, BitSet>
and used computeIfAbsent(y) { BitSet() }.set(x)
but I switched to Array<BitSet>
for a little extra speed 🚤ephemient
12/14/2022, 8:15 PMtodd.ginsberg
12/14/2022, 8:26 PMxxfast
12/15/2022, 6:33 AMphldavies
12/15/2022, 7:12 AM