My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 57 lines 1.5 kB view raw
1import fileinput 2import re 3 4connections = {} 5 6# Set up dictionary of connections 7for line in fileinput.input(): 8 rule, wire = re.search(r'(.*) -> (.*)', line).groups() 9 value = None 10 11 if len(rule.split()) == 1: 12 value = (rule,) 13 elif 'NOT' in rule: 14 value = ('NOT', rule.split()[1]) 15 else: 16 value = (rule.split()[1], rule.split()[0], rule.split()[2]) 17 18 connections[wire] = value 19 20connections2 = connections.copy() 21 22def follow(wire, c): 23 rule = c[wire] 24 val = None 25 26 # Base case 27 if len(rule) == 1: 28 if rule[0].isdigit(): 29 return int(rule[0]) 30 else: 31 return follow(rule[0], c) 32 33 elif len(rule) == 2: 34 return ~follow(rule[1], c) 35 36 else: 37 if rule[0] == 'AND': 38 val = (int(rule[1]) if rule[1].isdigit() else follow(rule[1], c)) & (int(rule[2]) if rule[2].isdigit() else follow(rule[2], c)) 39 elif rule[0] == 'OR': 40 val = (int(rule[1]) if rule[1].isdigit() else follow(rule[1], c)) | (int(rule[2]) if rule[2].isdigit() else follow(rule[2], c)) 41 elif rule[0] == 'LSHIFT': 42 val = follow(rule[1], c) << int(rule[2]) 43 elif rule[0] == 'RSHIFT': 44 val = follow(rule[1], c) >> int(rule[2]) 45 46 if type(val) is int: 47 c[wire] = (str(val),) 48 49 return val 50 51s = follow('a', connections) 52 53print "Signal to wire a: %d" % s 54 55connections2['b'] = (str(s), ) 56 57print "After overriding b to %s, signal to a is %d" % (s, follow('a', connections2))