-
Notifications
You must be signed in to change notification settings - Fork 0
/
day2.py
47 lines (38 loc) · 1.48 KB
/
day2.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
_inp = """
1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,13,1,19,1,19,10,23,1,23,6,27,1,6,27,31,1,13,31,35,1,
13,35,39,1,39,13,43,2,43,9,47,2,6,47,51,1,51,9,55,1,55,9,59,1,59,6,63,1,9,63,67,2,67,10
,71,2,71,13,75,1,10,75,79,2,10,79,83,1,83,6,87,2,87,10,91,1,91,6,95,1,95,13,99,1,99,13,103
,2,103,9,107,2,107,10,111,1,5,111,115,2,115,9,119,1,5,119,123,1,123,9,127,1,127,2,131,1,5,131,0,99,2,0,14,0
"""
class InvalidOpcodeError(Exception):
pass
def execute_opcode(opcodes, offset):
if opcodes[offset] == 1:
opcodes[opcodes[offset + 3]] = opcodes[opcodes[offset + 1]] + opcodes[opcodes[offset + 2]]
elif opcodes[offset] == 2:
opcodes[opcodes[offset + 3]] = opcodes[opcodes[offset + 1]] * opcodes[opcodes[offset + 2]]
elif opcodes[offset] == 99:
return False
else:
raise InvalidOpcodeError
return True
def run_program(opcodes, noun, verb, opcode_size=4):
opcodes = [int(instruction) for instruction in opcodes.strip().split(',')]
opcodes[1] = noun
opcodes[2] = verb
for i in range(0, len(opcodes), opcode_size):
try:
result = execute_opcode(opcodes, i)
if not result:
break
except InvalidOpcodeError:
print("Something wen't wrong")
if opcodes[0] == 19690720:
return True
return False
if __name__ == "__main__":
for i in range(101):
for j in range(101):
result = run_program(_inp, i, j)
if result:
print(100 * i + j)