Advent of Code 2023 day 11
12/11/2025, 5:00 AMMarcin Wisniowski
12/11/2025, 5:14 AMMarcin Wisniowski
12/11/2025, 5:18 AMMichael de Kaste
12/11/2025, 5:25 AMJakub Gwóźdź
12/11/2025, 5:33 AMfun outputs(data: String) = data.reader().readLines().associate {
it.split(":")
.let { (device, outputs) -> device to outputs.split(' ').map(String::trim).filterNot(String::isBlank) }
}
fun dfs(end: String, start: String, graph: Map<String, List<String>>): Long {
val cache = mutableMapOf<String, Long>()
fun search(id: String): Long = graph[id].orEmpty().sumOf { i ->
if (i == start) 1 else cache.getOrPut(i) { search(i) }
}
return search(end)
}
fun part1(data: String): Any {
val inputs = outputs(data)
return dfs("you", "out", inputs)
}
fun part2(data: String): Any {
val inputs = outputs(data)
return dfs("svr", "fft", inputs) * dfs("fft", "dac", inputs) * dfs("dac", "out", inputs) +
dfs("svr", "dac", inputs) * dfs("dac", "fft", inputs) * dfs("fft", "out", inputs)
}Dan Fingal-Surma
12/11/2025, 6:29 AMDan Fingal-Surma
12/11/2025, 6:36 AMephemient
12/11/2025, 6:37 AMDan Fingal-Surma
12/11/2025, 6:40 AMNorbert Kiesel
12/11/2025, 6:53 AMphldavies
12/11/2025, 7:53 AMDan Fingal-Surma
12/11/2025, 7:53 AMMichael de Kaste
12/11/2025, 7:54 AMephemient
12/11/2025, 7:55 AMphldavies
12/11/2025, 7:57 AMdac to fftDan Fingal-Surma
12/11/2025, 8:05 AMMichael Böiers
12/11/2025, 9:13 AMfun main() {
val links = generateSequence(::readLine).associate { line -> line.split(": ").let { it[0] to it[1].split(" ") } }
val cache = mutableMapOf<Pair<String, Set<String>>, Long>()
fun String.findOut(visit: Set<String> = setOf(), seen: Set<String> = setOf()): Long = cache.getOrPut(this to seen) {
when {
this == "out" -> if (seen == visit) 1 else 0
else -> links.getValue(this).sumOf { it.findOut(visit, if (it in visit) seen + it else seen) }
}
}
println("you".findOut())
println("svr".findOut(setOf("fft", "dac")))
}Andriy
12/11/2025, 12:41 PMcompanion object Part2 {
const val START = "svr"
const val POINT1 = "dac"
const val POINT2 = "fft"
const val END = "out"
}
fun solvePart2(): Long {
data class Path(val start: String, val notPass: Set<String>, val end: String)
val memo = mutableMapOf<Path, Long>()
fun track(state: Path): Long {
if (state.start == state.end) return 1
if (state.start in state.notPass) return 0
val next = graph[state.start]!!
return next.sumOf {
val newState = Path(it, state.notPass, state.end)
memo.getOrPut(newState) { track(newState) }
}
}
val part1 =
track(Path(start = START, notPass = setOf(POINT2, END), end = POINT1)) *
track(Path(start = POINT1, notPass = setOf(START, END), end = POINT2)) *
track(Path(start = POINT2, notPass = setOf(START, POINT1), end = END))
val part2 =
track(Path(start = START, notPass = setOf(POINT1, END), end = POINT2)) *
track(Path(start = POINT2, notPass = setOf(START, END), end = POINT1)) *
track(Path(start = POINT1, notPass = setOf(START, POINT2), end = END))
return part1 + part2
}