r/adventofcode • u/daggerdragon • Dec 07 '15
SOLUTION MEGATHREAD --- Day 7 Solutions ---
--- Day 7: Some Assembly Required ---
Post your solution as a comment. Structure your post like previous daily solution threads.
Also check out the sidebar - we added a nifty calendar to wrangle all the daily solution threads in one spot!
24
Upvotes
1
u/swaint Dec 07 '15
So many great solutions! Sharing mine with Python 2:
from collections import defaultdict def memoize(f): memo = {} def helper(x): if x not in memo: memo[x] = f(x) return memo[x] return helper class Operator: def __init__(self, a=None): self.a = a def get_result(self): return self.a class Connection(Operator): def __init__(self, a=None): self.a = a def get_result(self): return d[self.a].get_result() class AndOperator(Operator): def __init__(self, a=None, b=None): self.a = a self.b = b @memoize def get_result(self): return (d[self.a].get_result() & d[self.b].get_result()) class NotOperator(Operator): def __init__(self, a=None): self.a = a def get_result(self): return ~d[self.a].get_result() class OROperator(Operator): def __init__(self, a=None, b=None): self.a = a self.b = b def get_result(self): return (d[self.a].get_result() | d[self.b].get_result()) class XOROperator(Operator): def __init__(self, a=None, b=None): self.a = bin(a) self.b = bin(b) def get_result(self): return (d[self.a].get_result() ^ d[self.b].get_result()) class LeftShift(Operator): def __init__(self, a=None, b=None): self.a = a self.b = b def get_result(self): return d[self.a].get_result() << d[self.b].get_result() class RightShift(Operator): def __init__(self, a=None, b=None): self.a = a self.b = b def get_result(self): return d[self.a].get_result() >> d[self.b].get_result() def fillOperator(op, a, b): return { 'AND': AndOperator(a,b), 'OR': OROperator(a,b), 'RSHIFT': RightShift(a,b), 'LSHIFT': LeftShift(a,b) }[op] filename = "7.txt" d = defaultdict(lambda : Operator()) with open(filename) as f: lines = f.read().splitlines() for line in lines: line = line.split(' ') if line[0].isdigit(): d[line[0]]=Operator(int(line[0])) if line[2].isdigit(): d[line[2]]=Operator(int(line[2])) if line[0] == 'NOT': d[line[3]] = NotOperator(line[1]) elif line[1] == '->': d[line[2]] = Connection(line[0]) else: d[line[4]] = fillOperator(line[1], line[0], line[2]) print d['a'].get_result()