My Advent of Code solutions in Python.
kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code
python
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))