Skip to content

Commit c6c44e7

Browse files
committed
Add day07
1 parent 143624f commit c6c44e7

1 file changed

Lines changed: 103 additions & 0 deletions

File tree

2015/day-07/main.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# --- Day 7: Some Assembly Required ---
2+
from collections import defaultdict
3+
import operator
4+
5+
def part1():
6+
# read input
7+
# all possible gates: AND, OR, LSHIFT, RSHIFT, NOT
8+
ops = {'AND': operator.and_, 'OR': operator.or_, 'LSHIFT': operator.lshift, 'RSHIFT': operator.rshift}
9+
max_val = 65535
10+
11+
lines = open("../inputs/day-07.txt").readlines()
12+
output = {}
13+
remaining = list(lines)
14+
while remaining:
15+
unresolved = []
16+
for line in remaining:
17+
items = line.strip().split('->')
18+
granular_items = items[0].split()
19+
res = items[1].strip()
20+
if len(granular_items) == 1:
21+
token = items[0].strip()
22+
if token.isdigit():
23+
output[res] = int(token)
24+
elif token in output:
25+
output[res] = output[token]
26+
else:
27+
unresolved.append(line)
28+
continue
29+
elif len(granular_items) > 2:
30+
first_gran_item = granular_items[0]
31+
second_gran_item = granular_items[1]
32+
third_gran_item = granular_items[2]
33+
left_val = int(first_gran_item) if first_gran_item.isdigit() else output.get(first_gran_item)
34+
right_val = int(third_gran_item) if third_gran_item.isdigit() else output.get(third_gran_item)
35+
if left_val is None or right_val is None:
36+
unresolved.append(line)
37+
continue
38+
output[res] = ops[second_gran_item](left_val, right_val)
39+
else:
40+
second_gran_item = granular_items[1]
41+
if second_gran_item not in output:
42+
unresolved.append(line)
43+
continue
44+
output[res] = max_val - output[second_gran_item]
45+
output[res] &= max_val
46+
if len(unresolved) == len(remaining):
47+
break # to avoid infinite loop
48+
remaining = unresolved
49+
50+
return output['a']
51+
52+
53+
def part2():
54+
ops = {'AND': operator.and_, 'OR': operator.or_, 'LSHIFT': operator.lshift, 'RSHIFT': operator.rshift}
55+
max_val = 65535
56+
57+
lines = open("../inputs/day-07.txt").readlines()
58+
a_signal = part1()
59+
60+
output = {'b': a_signal}
61+
remaining = [line for line in lines if line.strip().split('->')[1].strip() != 'b']
62+
while remaining:
63+
unresolved = []
64+
for line in remaining:
65+
items = line.strip().split('->')
66+
granular_items = items[0].split()
67+
res = items[1].strip()
68+
if len(granular_items) == 1:
69+
token = items[0].strip()
70+
if token.isdigit():
71+
output[res] = int(token)
72+
elif token in output:
73+
output[res] = output[token]
74+
else:
75+
unresolved.append(line)
76+
continue
77+
elif len(granular_items) > 2:
78+
first_gran_item = granular_items[0]
79+
second_gran_item = granular_items[1]
80+
third_gran_item = granular_items[2]
81+
left_val = int(first_gran_item) if first_gran_item.isdigit() else output.get(first_gran_item)
82+
right_val = int(third_gran_item) if third_gran_item.isdigit() else output.get(third_gran_item)
83+
if left_val is None or right_val is None:
84+
unresolved.append(line)
85+
continue
86+
output[res] = ops[second_gran_item](left_val, right_val)
87+
else:
88+
second_gran_item = granular_items[1]
89+
if second_gran_item not in output:
90+
unresolved.append(line)
91+
continue
92+
output[res] = max_val - output[second_gran_item]
93+
output[res] &= max_val
94+
if len(unresolved) == len(remaining):
95+
break
96+
remaining = unresolved
97+
98+
return output['a']
99+
100+
101+
if __name__ == "__main__":
102+
print("Part 1:", part1())
103+
print("Part 2:", part2())

0 commit comments

Comments
 (0)