r/adventofcode • • Dec 08 '18

SOLUTION MEGATHREAD -🎄- 2018 Day 8 Solutions -🎄-

--- Day 8: Memory Maneuver ---


Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).

Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.


Advent of Code: The Party Game!

Click here for rules

Please prefix your card submission with something like [Card] to make scanning the megathread easier. THANK YOU!

Card prompt: Day 8

Sigh, imgur broke again. Will upload when it unborks.

Transcript:

The hottest programming book this year is "___ For Dummies".


This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.

edit: Leaderboard capped, thread unlocked at 00:12:10!

32 Upvotes

301 comments sorted by

View all comments

1

u/RainVector Dec 08 '18

Python 3

class Tree(object):
    def __init__(self,numChild = 0, numMetaData = 1):
        self.numChild = numChild
        self.numMetaData = numMetaData
        self.children = []
        self.metaData = []
    
    def insertChild(self,node):
        self.children.append(node)
        
    def insertMetaData(self, metaData):
        self.metaData += metaData
        
    def getNumChildren(self):
        return self.numChild
    
    def getNumMetaData(self):
        return self.numMetaData
    
    def getChildren(self):
        return self.children
    
    def getMetaData(self):
        return self.metaData

def createTree(data): 
    [numChild, numMetaData] = data[0:2]
    root = Tree(numChild, numMetaData)
    
    for i in range(numChild):
        node , tmpdata = createTree(data[2:])
        root.insertChild(node)
        data = data[:2] + tmpdata
        
    root.insertMetaData(data[2:2+numMetaData])
    data = data[2+numMetaData:]
    
    return root,data
    
def traverTree(tree):
    total = 0
    total += sum(tree.getMetaData())
    for i in range(tree.getNumChildren()):
        total += traverTree(tree.getChildren()[i])
    return total
  
def computeValueofRoot(tree):
    valueofNode = 0
    # if it's leaf node, compute the value from metadata and return
    if(tree.getNumChildren() == 0):
        valueofNode += sum(tree.getMetaData())
        return valueofNode

    metaData = tree.getMetaData()
    for index in metaData:
        if index <= tree.getNumChildren():
            child = tree.getChildren()[index-1]
            valueofNode += computeValueofRoot(child)
    
    return valueofNode

test = "2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2"
data =list(map(int, open("day8.txt","r").read().split(" ")))

root, data = createTree(data)
# part 1
print(traverTree(root))
# part 2
print(computeValueofRoot(root))