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
}