This repository was archived by the owner on Oct 13, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday19.py
More file actions
executable file
·69 lines (55 loc) · 1.93 KB
/
Copy pathday19.py
File metadata and controls
executable file
·69 lines (55 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import re
def get_data():
with open('input') as f:
data = []
for line in f:
op = re.findall(r'([a-zA-Z]+)', line)
values = list(map(int, re.findall(r'(\d+)', line)))
data.append(op + values)
return data
def init(data):
registers = [0] * 6
ops = {
'addr': lambda regs, a, b: regs[a] + regs[b],
'addi': lambda regs, a, b: regs[a] + b,
'mulr': lambda regs, a, b: regs[a] * regs[b],
'muli': lambda regs, a, b: regs[a] * b,
'banr': lambda regs, a, b: regs[a] & regs[b],
'bani': lambda regs, a, b: regs[a] & b,
'borr': lambda regs, a, b: regs[a] | regs[b],
'bori': lambda regs, a, b: regs[a] | b,
'setr': lambda regs, a, b: regs[a],
'seti': lambda regs, a, b: a,
'gtir': lambda regs, a, b: int(a > regs[b]),
'gtri': lambda regs, a, b: int(regs[a] > b),
'gtrr': lambda regs, a, b: int(regs[a] > regs[b]),
'eqir': lambda regs, a, b: int(a == regs[b]),
'eqri': lambda regs, a, b: int(regs[a] == b),
'eqrr': lambda regs, a, b: int(regs[a] == regs[b]),
}
ip = data[0][1]
return registers, ops, ip
def part_1(data):
registers, ops, ip = init(data)
data = data[1:]
while registers[ip] < len(data):
op, a, b, c = data[registers[ip]]
registers[c] = ops[op](registers, a, b)
registers[ip] += 1
return registers[0] - 1 if ip == 0 else registers[0]
def part_2(data):
registers, ops, ip = init(data)
registers[0] = 1
data = data[1:]
while registers[ip] < len(data):
op, a, b, c = data[registers[ip]]
registers[c] = ops[op](registers, a, b)
registers[ip] += 1
if registers[1] == 1:
return 'Sum of factors of {0}'.format(registers[-1])
def main():
data = get_data()
print('1:', part_1(data))
print('2:', part_2(data))
if __name__ == '__main__':
main()