74 lines
1.8 KiB
Python
74 lines
1.8 KiB
Python
|
#!/bin/python
|
||
|
|
||
|
def check(code):
|
||
|
visited = [False for _ in range(len(code) + 1)]
|
||
|
acc = 0
|
||
|
pointer = 0;
|
||
|
|
||
|
while not visited[pointer]:
|
||
|
instr = code[pointer].split(" ")
|
||
|
|
||
|
visited[pointer] = True
|
||
|
|
||
|
if instr[0] == "acc":
|
||
|
acc += int(instr[1])
|
||
|
pointer += 1
|
||
|
elif instr[0] == "nop":
|
||
|
pointer += 1
|
||
|
elif instr[0] == "jmp":
|
||
|
pointer += int(instr[1])
|
||
|
|
||
|
if pointer >= len(code):
|
||
|
return acc
|
||
|
|
||
|
return None
|
||
|
|
||
|
with open("input", 'r') as input:
|
||
|
code = [line.strip() for line in input.readlines()]
|
||
|
candidates = []
|
||
|
for idx, instr in enumerate(code):
|
||
|
parts = instr.split(" ")
|
||
|
if parts[0] == "acc":
|
||
|
continue
|
||
|
|
||
|
value = int(parts[1])
|
||
|
if parts[0] == "nop" and ((value < 2 and value > -2) or (idx + value) > len(code) + 1):
|
||
|
continue
|
||
|
|
||
|
candidates.append(idx)
|
||
|
|
||
|
|
||
|
print(len(candidates))
|
||
|
for candidate in candidates:
|
||
|
new_code = list(code)
|
||
|
if new_code[candidate].startswith("nop"):
|
||
|
new_code[candidate] = new_code[candidate].replace("nop", "jmp")
|
||
|
else:
|
||
|
new_code[candidate] = new_code[candidate].replace("jmp", "nop")
|
||
|
|
||
|
print(f"Checking candidate {candidate}...")
|
||
|
|
||
|
result = check(new_code)
|
||
|
if result:
|
||
|
print(f"Found candidate with acc: {result}")
|
||
|
break
|
||
|
|
||
|
# visited = [False for _ in range(len(code) + 1)]
|
||
|
# acc = 0
|
||
|
# pointer = 0;
|
||
|
|
||
|
# while not visited[pointer]:
|
||
|
# instr = code[pointer].split(" ")
|
||
|
|
||
|
# visited[pointer] = True
|
||
|
|
||
|
# if instr[0] == "acc":
|
||
|
# acc += int(instr[1])
|
||
|
# pointer += 1
|
||
|
# elif instr[0] == "nop":
|
||
|
# pointer += 1
|
||
|
# elif instr[0] == "jmp":
|
||
|
# pointer += int(instr[1])
|
||
|
|
||
|
# print(acc)
|