@AoKSolution object Day08Immutable : PuzDSL({ val parse = parser { val (route, net) = input.split("\n\n", limit = 2) route to net.trim().lines().associate { val (from, left, right) = it.split(" = (", ", ", ")") from to (left to right) } } part1(parse) { (route, net) -> sequence { while(true) yieldAll(route.asIterable()) }.runningFold("AAA") { at, n -> when(n) { 'L' -> net.getValue(at).first 'R' -> net.getValue(at).second else -> at } }.indexOf("ZZZ") } part2(parse) { (route, net) -> val lengths = net.keys.filter { it.endsWith('A') }.map { sequence { while(true) yieldAll(route.asIterable()) }.runningFold(it) { at, n -> when(n) { 'L' -> net.getValue(at).first 'R' -> net.getValue(at).second else -> at } }.indexOfFirst { at -> at.endsWith('Z') }.toLong() } lengths.reduce(::lcm) } })