77 lines
1.7 KiB
Python
77 lines
1.7 KiB
Python
#!/usr/bin/python
|
|
|
|
def uniqexists(l):
|
|
exists = {}
|
|
for i in l:
|
|
try:
|
|
exists[i] += 1
|
|
except KeyError:
|
|
exists[i] = 1
|
|
for i in exists:
|
|
if exists[i] > 1: return exists[i]
|
|
|
|
fd = open('input', 'r')
|
|
o = [i.rstrip() for i in fd.readlines()]
|
|
|
|
def sol1():
|
|
pc = 0
|
|
acc = 0
|
|
ins_hist = []
|
|
ops = o
|
|
while uniqexists(ins_hist) == None:
|
|
split = ops[pc].split(' ')
|
|
ins = split[0]
|
|
arg = split[1]
|
|
|
|
ins_hist.append(pc)
|
|
|
|
if ins == "nop":
|
|
pc += 1
|
|
elif ins == "acc":
|
|
pc += 1
|
|
acc += int(arg)
|
|
elif ins == "jmp":
|
|
if int(arg) == 0: acc += 1
|
|
pc += int(arg)
|
|
print(acc)
|
|
|
|
def sol2():
|
|
realops = o
|
|
for i in range(len(realops)):
|
|
ops = []
|
|
for j in realops:
|
|
ops.append(j)
|
|
split = ops[i].split(' ')
|
|
mod_ins = split[0]
|
|
mod_arg = split[1]
|
|
if mod_ins == "jmp":
|
|
ops[i] = "{} {}".format("nop", mod_arg)
|
|
elif mod_ins == "nop":
|
|
ops[i] = "{} {}".format("jmp", mod_arg)
|
|
|
|
pc = 0
|
|
acc = 0
|
|
ins_hist = []
|
|
try:
|
|
while uniqexists(ins_hist) == None:
|
|
split = ops[pc].split(' ')
|
|
ins = split[0]
|
|
arg = split[1]
|
|
|
|
ins_hist.append(pc)
|
|
|
|
if ins == "nop":
|
|
pc += 1
|
|
elif ins == "acc":
|
|
pc += 1
|
|
acc += int(arg)
|
|
elif ins == "jmp":
|
|
if int(arg) == 0: acc += 1
|
|
pc += int(arg)
|
|
except IndexError:
|
|
print("-!- MACHINE HALT -!-")
|
|
print(acc)
|
|
|
|
sol1()
|
|
sol2()
|