-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday08.py
55 lines (49 loc) · 1.26 KB
/
day08.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
import copy
def parse(lines):
instructions = []
for line in lines:
op, arg = line.split()
instructions.append([op, int(arg)])
return instructions
def change_at(program, index):
op = program[index][0]
new_op = None
if op == 'nop':
new_op = 'jmp'
elif op == 'jmp':
new_op = 'nop'
else:
return program
new_program = copy.deepcopy(program)
new_program[index][0] = new_op
return new_program
def run(program):
visited = []; sp = 0; acc = 0
while sp not in visited and sp < len(program):
visited.append(sp)
op, arg = program[sp]
if op == 'acc':
acc += arg
sp += 1
elif op == 'nop':
sp += 1
elif op == 'jmp':
sp += arg
return acc, sp
def part2(program):
for i, _ in enumerate(program):
prog = change_at(program, i)
acc, sp = run(prog)
if sp == len(program):
return acc
def main(inp):
with open(inp) as f:
lines = f.read().splitlines()
program = parse(lines)
res1 = run(program)[0]
res2 = part2(program)
return res1, res2
if __name__ == '__main__':
a, b = main('../input/input08.txt')
print('day08.1:', a)
print('day08.2:', b)