var input = require("fs").readFileSync("input.txt").toString().replace("\n", ""); var nums = input.split(" ").map(a=>(parseInt(a))); function parseTree(ints){ var numChildren = ints[0]; var numMeta = ints[1]; var children = []; var i = 0; while(numChildren > 0){ var childParsed = parseTree(ints.slice(2 + i)); i += childParsed[1].length; children.push(childParsed[0]); numChildren--; } return [{children: children, meta: ints.slice(2+i, 2+i+numMeta)}, ints.slice(0, 2+i+numMeta)] } function nodeValue(node){ var total = 0; if(node.children.length){ return node.meta.map(a=>(a-1)).map(a=>(node.children[a])).filter(a=>(a)).map(n=>(nodeValue(n))).reduce((a,b)=>(a+b), 0); } else{ return node.meta.reduce((a,b)=>(a+b)); } } console.log(nodeValue(parseTree(nums)[0]));