Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- reg="""3,225,1,225,6,6,1100,1,238,225,104,0,1101,90,60,224,1001,224,-150,224,4,224,1002,223,8,223,1001,224,7,224,1,224,223,223,1,57,83,224,1001,224,-99,224,4,224,1002,223,8,223,1001,224,5,224,1,223,224,223,1102,92,88,225,101,41,187,224,1001,224,-82,224,4,224,1002,223,8,223,101,7,224,224,1,224,223,223,1101,7,20,225,1101,82,64,225,1002,183,42,224,101,-1554,224,224,4,224,102,8,223,223,1001,224,1,224,1,224,223,223,1102,70,30,224,101,-2100,224,224,4,224,102,8,223,223,101,1,224,224,1,224,223,223,2,87,214,224,1001,224,-2460,224,4,224,1002,223,8,223,101,7,224,224,1,223,224,223,102,36,180,224,1001,224,-1368,224,4,224,1002,223,8,223,1001,224,5,224,1,223,224,223,1102,50,38,225,1102,37,14,225,1101,41,20,225,1001,217,7,224,101,-25,224,224,4,224,1002,223,8,223,101,2,224,224,1,224,223,223,1101,7,30,225,1102,18,16,225,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,7,226,226,224,102,2,223,223,1006,224,329,101,1,223,223,1107,677,226,224,102,2,223,223,1006,224,344,1001,223,1,223,8,677,226,224,1002,223,2,223,1005,224,359,101,1,223,223,107,677,677,224,1002,223,2,223,1006,224,374,101,1,223,223,7,677,226,224,1002,223,2,223,1006,224,389,101,1,223,223,108,677,226,224,1002,223,2,223,1005,224,404,101,1,223,223,1108,677,226,224,102,2,223,223,1005,224,419,101,1,223,223,8,226,677,224,102,2,223,223,1006,224,434,1001,223,1,223,1008,677,677,224,1002,223,2,223,1005,224,449,1001,223,1,223,1107,226,677,224,102,2,223,223,1006,224,464,101,1,223,223,107,226,677,224,1002,223,2,223,1006,224,479,1001,223,1,223,7,226,677,224,102,2,223,223,1005,224,494,1001,223,1,223,8,677,677,224,102,2,223,223,1006,224,509,1001,223,1,223,1108,677,677,224,102,2,223,223,1005,224,524,1001,223,1,223,1108,226,677,224,1002,223,2,223,1005,224,539,101,1,223,223,107,226,226,224,102,2,223,223,1006,224,554,1001,223,1,223,1007,226,226,224,102,2,223,223,1005,224,569,1001,223,1,223,1008,226,226,224,102,2,223,223,1005,224,584,101,1,223,223,1007,677,677,224,1002,223,2,223,1005,224,599,1001,223,1,223,108,677,677,224,1002,223,2,223,1006,224,614,1001,223,1,223,1007,226,677,224,1002,223,2,223,1006,224,629,101,1,223,223,1008,677,226,224,102,2,223,223,1005,224,644,101,1,223,223,1107,226,226,224,1002,223,2,223,1005,224,659,1001,223,1,223,108,226,226,224,1002,223,2,223,1005,224,674,101,1,223,223,4,223,99,226"""
- inputval = 0
- def extractvals(a):
- pa = int(a)
- pe = pa%10
- pa /= 10
- pa = int(pa)
- pd = pa%10
- pa /= 10
- pa = int(pa)
- pc = pa%10
- pa /= 10
- pa = int(pa)
- pb = pa%10
- pa /= 10
- pa = int(pa)
- return pa, pb, pc, pd, pe
- class Computer(object):
- def __init__(self, pc, reg, id):
- self.id = id
- self.pc = pc
- reg = [int(i) for i in reg.split(',')]
- self.reg = reg
- self.inputvals = []
- self.outs = []
- self.lastout = None
- self.nextc = None
- self.inputs = 0
- def addinput(self, a):
- self.inputs += 1
- self.inputvals.append(a)
- #print('add input id', self.id, a)
- def addinputs(self, a):
- for i in a:
- self.addinput(a)
- def attempt(self):
- #print("begin attempt" + str(self.id))
- reg = self.reg
- def inputf():
- if len(self.inputvals) == 0:
- #print("suspending", self.id, self.pc)
- raise Exception()
- #print("consuming input", self.id, self.inputvals[0], self.pc)
- return self.inputvals.pop(0)
- def outputf(a):
- self.lastout = a
- self.outs.append(a)
- self.nextc.addinput(a)
- #print("id",self.id, a)
- def op1(a, b, c, d, reg):
- pa, pb, pc, _, _ = extractvals(a)
- if pc == 1:
- rb = b
- else:
- rb = reg[b]
- if pb == 1:
- rc = c
- else:
- rc = reg[c]
- #print(rb)
- #print(rc)
- reg[d] = rb + rc
- def op2(a, b,c,d, reg):
- pa, pb, pc, _, _ = extractvals(a)
- if pc == 1:
- rb = b
- else:
- rb = reg[b]
- if pb == 1:
- rc = c
- else:
- rc = reg[c]
- reg[d] = rb * rc
- def op3(b, reg):
- reg[b] = inputf()
- def op4(b, reg):
- outputf(reg[b])
- def op5(a,b,c, reg, counter):
- pa, pb, pc, _, _ = extractvals(a)
- if pc == 1:
- rb = b
- else:
- rb = reg[b]
- if pb == 1:
- rc = c
- else:
- rc = reg[c]
- if rb != 0:
- return rc
- else:
- return 3 + counter
- def op6(a,b,c, reg, counter):
- pa, pb, pc, _, _ = extractvals(a)
- if pc == 1:
- rb = b
- else:
- rb = reg[b]
- if pb == 1:
- rc = c
- else:
- rc = reg[c]
- if rb == 0:
- return rc
- else:
- return 3 + counter
- def op7(a,b,c,d, reg):
- pa, pb, pc, _, _ = extractvals(a)
- if pc == 1:
- rb = b
- else:
- rb = reg[b]
- if pb == 1:
- rc = c
- else:
- rc = reg[c]
- if rb < rc:
- reg[d] = 1
- else:
- reg[d] = 0
- def op8(a,b,c,d, reg):
- pa, pb, pc, _, _ = extractvals(a)
- if pc == 1:
- rb = b
- else:
- rb = reg[b]
- if pb == 1:
- rc = c
- else:
- rc = reg[c]
- if rb == rc:
- reg[d] = 1
- else:
- reg[d] = 0
- pc = self.pc
- while True:
- i = pc
- #print("pc counter", self.id, pc)
- if reg[i]%10 == 1:
- op1(reg[i], reg[i+1], reg[i+2], reg[i+3], reg)
- pc += 4
- elif reg[i]%10 == 2:
- op2(reg[i], reg[i+1], reg[i+2], reg[i+3], reg)
- pc += 4
- elif reg[i]%10 == 3:
- try:
- op3(reg[i+1], reg)
- except Exception:
- return 1;
- pc += 2
- elif reg[i]%10 == 4:
- op4(reg[i+1], reg)
- pc += 2
- elif reg[i]%10 == 5:
- pc = op5(reg[i], reg[i+1], reg[i+2], reg, pc)
- elif reg[i]%10 == 6:
- pc = op6(reg[i], reg[i+1], reg[i+2], reg, pc)
- elif reg[i]%10 == 7:
- op7(reg[i], reg[i+1], reg[i+2], reg[i+3], reg)
- pc+=4
- elif reg[i]%10 == 8:
- op8(reg[i], reg[i+1], reg[i+2], reg[i+3], reg)
- pc+=4
- elif reg[i] == 99:
- #print("halted")
- return 0
- #print("pc counter", self.id, pc)
- self.pc = pc
- return 0
- def optimize(seq):
- reg = """3,8,1001,8,10,8,105,1,0,0,21,34,55,68,93,106,187,268,349,430,99999,3,9,102,5,9,9,1001,9,2,9,4,9,99,3,9,1001,9,5,9,102,2,9,9,101,2,9,9,102,2,9,9,4,9,99,3,9,101,2,9,9,102,4,9,9,4,9,99,3,9,101,4,9,9,102,3,9,9,1001,9,2,9,102,4,9,9,1001,9,2,9,4,9,99,3,9,101,2,9,9,1002,9,5,9,4,9,99,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,99"""
- #reg = """3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5"""
- #reg = "3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0"
- #reg = "3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10"
- computers = [Computer(0, reg, i) for i in range(5)]
- for i in range(5):
- computers[i].nextc = computers[(i+1)%5]
- for i in range(5):
- computers[i].addinput(seq[i])
- computers[0].addinput(0)
- suspended = 5
- lastval = 0
- while suspended != 0:
- #for i in range(2):
- suspended = 0
- for i in range(len(computers)):
- suspend = computers[i].attempt()
- suspended += suspend
- return computers[4].lastout
- def maxopt():
- import itertools
- maxval = 0
- maxseq = []
- r = range(0,5)
- r = range(5, 10)
- for seq in itertools.permutations(list(r)):
- val = optimize(seq)
- if maxval < val:
- maxval = val
- maxseq = seq
- print(maxval)
- print("".join(map(str,maxseq)))
- maxopt()
- #print(optimize([9,8,7,6,5]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement