Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Comp:
- def __init__(self, phase):
- self.prgrm = [int(x) for x in open("7.txt").read().split(",")]
- self.ip = 0
- self.phase = phase
- self.first = True
- def reset(self, inp):
- self.prgrm = [int(x) for x in open("7.txt").read().split(",")]
- self.ip = 0
- self.first = True
- self.run(inp)
- def run(self, inp):
- while self.ip < len(self.prgrm):
- instr = str(self.prgrm[self.ip])
- for _ in range(5 - len(instr)):
- instr = "0" + instr
- if instr.endswith("99"):
- return None
- one = None
- two = None
- three = None
- if self.ip + 1 < len(self.prgrm):
- one = self.prgrm[self.ip + 1] if instr[2] == "0" else self.ip + 1
- if self.ip + 2 < len(self.prgrm):
- two = self.prgrm[self.ip + 2] if instr[1] == "0" else self.ip + 2
- if self.ip + 3 < len(self.prgrm):
- three = self.prgrm[self.ip + 3] if instr[0] == "0" else self.ip + 3
- if instr.endswith("01"):
- self.prgrm[three] = self.prgrm[one] + self.prgrm[two]
- self.ip += 4
- elif instr.endswith("02"):
- self.prgrm[three] = self.prgrm[one] * self.prgrm[two]
- self.ip += 4
- elif instr.endswith("03"):
- if self.first:
- self.prgrm[one] = self.phase
- self.first = False
- else:
- self.prgrm[one] = inp
- self.ip += 2
- elif instr.endswith("04"):
- output = self.prgrm[one]
- self.ip += 2
- return output
- elif instr.endswith("05"):
- if self.prgrm[one] != 0:
- self.ip = self.prgrm[two]
- else:
- self.ip += 3
- elif instr.endswith("06"):
- if self.prgrm[one] == 0:
- self.ip = self.prgrm[two]
- else:
- self.ip += 3
- elif instr.endswith("07"):
- if self.prgrm[one] < self.prgrm[two]:
- self.prgrm[three] = 1
- else:
- self.prgrm[three] = 0
- self.ip += 4
- elif instr.endswith("08"):
- if self.prgrm[one] == self.prgrm[two]:
- self.prgrm[three] = 1
- else:
- self.prgrm[three] = 0
- self.ip += 4
- else:
- print("i:", self.ip, "instr:", instr)
- break
- def finish(comps, inp):
- out = inp
- res = inp
- while res is not None:
- for comp in comps:
- res = comp.run(out)
- if res is None:
- break
- out = res
- return out
- def go(i, inp, used_p, comps):
- for comp in comps:
- comp.reset(inp)
- if i == 0:
- val = finish(comps, inp)
- print([p.phase for p in comps], val, inp)
- return val
- mx = 0
- for p in range(5, 10):
- if p in used_p:
- continue
- c = Comp(p)
- res = c.run(inp)
- mx = max(mx, go(i - 1, res, used_p + [p], comps + [c]))
- return mx
- if __name__ == '__main__':
- print(go(5, 0, [], []))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement