-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path2019_05_p2.py
85 lines (67 loc) · 2.15 KB
/
2019_05_p2.py
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from aoc import read_file, timer
def split_instruction(instruction):
instruction = f"{instruction:05}"
return instruction[3:], instruction[0:3]
def get_values(input, pos, op, modes):
mode_a, mode_b, mode_c = modes
values = []
if op in ["01", "02", "04", "05", "06", "07", "08"]:
if mode_c == "0":
values.append(input[input[pos+1]])
else:
values.append(input[pos+1])
if op in ["01", "02", "05", "06", "07", "08"]:
if mode_b == "0":
values.append(input[input[pos+2]])
else:
values.append(input[pos+2])
if op in []:
if mode_a == "0":
values.append(input[input[pos+3]])
else:
values.append(input[pos+3])
return values
@timer
def solve():
prog = read_file("05")[0].split(",")
prog = [int(x) for x in prog]
ip = 0
input = 5
while prog[ip] != 99:
op, modes = split_instruction(prog[ip])
values = get_values(prog, ip, op, modes)
if op == "01": # Addition
prog[prog[ip+3]] = values[0] + values[1]
ip += 4
if op == "02": # Multiplication
prog[prog[ip+3]] = values[0] * values[1]
ip += 4
if op == "03": # Read and Store prog
prog[prog[ip+1]] = input
ip += 2
if op == "04": # Print Output
print(values[0])
ip += 2
if op == "05": # Jump-if-True
if values[0]:
ip = values[1]
else:
ip += 3
if op == "06": # Jump-if-False
if not values[0]:
ip = values[1]
else:
ip += 3
if op == "07": # Less than
if values[0] < values[1]:
prog[prog[ip+3]] = 1
else:
prog[prog[ip+3]] = 0
ip += 4
if op == "08": # Equals
if values[0] == values[1]:
prog[prog[ip+3]] = 1
else:
prog[prog[ip+3]] = 0
ip += 4
result = solve()