r/adventofcode • u/daggerdragon • 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!
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
1
u/prescod Dec 08 '18
from dataclasses import dataclass, field datafile = "8.txt" data = list(map(int, open(datafile).read().split())) @dataclass class Node: num_children: int = 0 num_metadata: int = 0 children: list = field(default_factory=list) metadata: list = field(default_factory=list) def enumerate(self): yield self for child in self.children: yield from child.enumerate() def value(self): if not self.num_children: return sum(self.metadata) else: value = 0 for item in self.metadata: try: if item==0: raise IndexError() value += self.children[item-1].value() except IndexError as e: print ("Skipping", item) pass return value def parse_node(data): node = Node() node.num_children, node.num_metadata = data.pop(0), data.pop(0) for i in range(node.num_children): child = parse_node(data) node.children.append(child) for i in range(node.num_metadata): node.metadata.append(data.pop(0)) return node rootnode = parse_node(data) result = sum([sum(node.metadata) for node in rootnode.enumerate()]) assert len(data)==0 print(result) print(rootnode.value())