val input = readText("y2018/w2/d08/input.txt") class Node(val children: Array, val meta: IntArray) fun parseNode(tape: Iterator): Node { val childCount = tape.next() val metaCount = tape.next() return Node(Array(childCount) { parseNode(tape) }, IntArray(metaCount) { tape.next() }) } fun Node.metaSum(): Int = meta.sum() + children.sumBy { it.metaSum() } fun Node.value(): Int = if (children.isEmpty()) meta.sum() else meta.sumBy { children.getOrNull(it - 1)?.value() ?: 0 } fun main(args: Array) { val numbers = input.split(' ').map { it.toInt() } val root = parseNode(numbers.iterator()) println(root.metaSum()) println(root.value()) }