object Day11 : AdventOfCode({ val parsed = input .lines() .map { it.split(""" |: """.toRegex()) } .associate{ it[0] to it.drop(1) } part1{ val visited = mutableMapOf() fun recurse(name: String): Long = visited.getOrPut(name) { when(name){ "out" -> 1L else -> parsed[name].orEmpty().sumOf { recurse(it) } } } recurse("you") } part2{ val visited = mutableMapOf, Long>() fun recurse(name: String, dac: Boolean, fft: Boolean): Long = visited.getOrPut(Triple(name, dac, fft)) { fun next(name: String, dac: Boolean, fft: Boolean) = parsed[name].orEmpty().sumOf { recurse(it, dac, fft) } when(name){ "dac" -> next(name, dac = true, fft) "fft" -> next(name, dac, fft = true) "out" if(dac && fft) -> 1L else -> next(name, dac, fft) } } recurse("svr", dac = false, fft = false) } })