Den 8. byl oproti včerejšku docela v pohodě 🙂 . Zde je mé řešení:
import java.io.File
data class Node(val id: Int) {
val children = mutableListOf<Node>()
val metadata = mutableListOf<Int>()
val value: Int by lazy {
if (children.isEmpty()) metadata.sum()
else {
metadata.sumBy { childRef ->
children
.take(childRef)
.takeIf { it.size == childRef }
?.lastOrNull()
?.value ?: 0
}
}
}
}
val allNodes = mutableSetOf<Node>()
fun main() {
val inputString = File("input8.txt").readText().trim()
val input = inputString
.split(Regex("\\s+"))
.map { it.toInt() }
.iterator()
val nodeIds = generateSequence(1) { it + 1 }.iterator()
val root = readNode(nodeIds, input)
//A
println(allNodes.flatMap { it.metadata }.sum())
//B
println(root.value)
}
fun readNode(nodeIds: Iterator<Int>, input: Iterator<Int>): Node {
val node = Node(nodeIds.next())
val childrenCount = input.next()
val metadataCount = input.next()
allNodes += node
repeat(childrenCount) {
node.children += readNode(nodeIds, input)
}
repeat(metadataCount) {
node.metadata += input.next()
}
return node
}