aboutsummaryrefslogtreecommitdiffstats
path: root/src/08/solve.py
blob: bc999d81161d51b9ac312acd96e3a278f1a6dba5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import sys
sys.path.append("../common")
import aoc

data = [int(v) for v in aoc.data.split(" ")]

def get_nodes(nsize, index):
    nodes = list()
    for i in range(nsize):
        cnsize = data[index + 0]
        mdsize = data[index + 1]
        cnodes, index = get_nodes(cnsize, index + 2)
        metadata = data[index:index + mdsize]
        nodes.append([cnodes, metadata])
        index = index + mdsize
    return nodes, index

def node_sum(nodes):
    metadata = 0
    for n in nodes:
        metadata += sum(n[1]) + node_sum(n[0])
    return metadata

def nodeValue(n):
    if len(n[0]) == 0:
        return sum(n[1])
    else:
        value = 0
        for i in range(len(n[1])):
            ni = n[1][i]-1
            if ni < len(n[0]):
                value += nodeValue(n[0][ni])
        return value

def solve1(args):
    nodes, index = get_nodes(1, 0)
    return node_sum(nodes)

def solve2(args):
    nodes, index = get_nodes(1, 0)
    return nodeValue(nodes[0])

aoc.run(solve1, solve2, sols=[36307, 25154])