class elf: #HasWork = False; #WorkTime = 0; #WorkStep = ''; def WorkAssign(self,s): AocOffset = 60; #correct value #AocOffset = 0; #example only self.WorkStep = s; self.WorkTime = ord(s) -64 + AocOffset; self.HasWork = True; def WorkReset(self): self.HasWork = False; #self.WorkTime = 0; self.WorkStep = ''; def DoWork(self): self.WorkTime += -1; #if # return def __init__(self):#, name, unlocks): self.HasWork = False; self.WorkTime = 1; self.WorkStep = ''; def __str__(self): return f"{self.WorkStep}\t{self.WorkTime}\t{self.HasWork}"; def WorkInProgress(elflist): w = False; for e in elflist: w += e.HasWork; return w; def TransInstr (instruction): return [instruction[5], instruction[36]]; myinput = {}; currentfilename = "input.txt"; numberofworkers = 5; #currentfilename = "testinput.txt"; #example only #numberofworkers = 2;#example only f = open(currentfilename, 'r'); #list1 = []; #list2 = {}; list2 = set(); for line in f: nowinstr = TransInstr(line); #myinput[nowinstr[1]].append(nowinstr[0]); list2.add(nowinstr[0]); #''' try: myinput[nowinstr[1]].append(nowinstr[0]); #myinput[nowinstr[1]] = nowinstr[0]; except: myinput[nowinstr[1]] = []; myinput[nowinstr[1]].append(nowinstr[0]); #''' print(myinput.keys()); print("##############"); print(list2); print("##############"); pr1 = list(myinput.keys()); pr1.sort(); pr2 = list(list2); pr2.sort(); print(pr1); print(pr2); print("##############"); print("##############"); print("finding the first step"); CurrentStep = ''; workers = []; for i in range(numberofworkers): workers.append(elf()); AvailableSteps = []; #AvailableSteps.append(CurrentStep); for l in list2: IsUnique = True; for k in myinput.keys(): #print("L ", l, "\tK ",k, "\t",l == k); if (l == k): IsUnique = False; break; if IsUnique: #CurrentStep = l; #break; AvailableSteps.append(l); print("Unique values are ", AvailableSteps); print("##############"); print(myinput); print("##############"); part1 = ""; #CurrentStep; #list1 = myinput.keys(); #list1.append(CurrentStep); #print(list1); part2 = -1; IsWork = False; print("whileloop begins"); while (len(AvailableSteps) != 0 or IsWork): part2 += 1;#input(); #IsWork = False; AvailableSteps.sort(); #CurrentStep = AvailableSteps[0]; print(part2, " - steps sorted:",AvailableSteps); for worker in workers: #print(worker); #print(worker.WorkTime); worker.DoWork(); if (worker.WorkTime == 0): # and worker.WorkStep != ''): part1 += worker.WorkStep; #if (worker.WorkSte if (worker.WorkStep != ''): for step in myinput: try: myinput[step].pop(myinput[step].index(worker.WorkStep)); except: pass; CurrentStepsCheck = "";# workers[0].WorkStep + workers[1].WorkStep + workers[2].WorkStep + workers[3].WorkStep; for w in workers: CurrentStepsCheck += w.WorkStep; if (len(myinput[step]) == 0 and part1.find(step) == -1 and CurrentStepsCheck.find(step) == -1 ): #and AvailableSteps.find(step) == -1): AvailableSteps.append(step); worker.WorkReset(); #worker.WorkStep() = ''; #worker.HasWork() = False; AvailableSteps = list(dict.fromkeys(AvailableSteps)); for worker in workers: if not worker.HasWork: if (len(AvailableSteps) > 0): worker.WorkAssign(AvailableSteps[0]); print("\tWorker begins step", AvailableSteps[0], "at second ", part2); AvailableSteps.pop(0); #else: #worker.DoWork(); #worker.WorkTime() += -1; #part1 += CurrentStep; #print("now ", CurrentStep); ''' for step in myinput: try: myinput[step].pop(myinput[step].index(CurrentStep)); except: pass; if (len(myinput[step]) == 0 and part1.find(step) == -1): #and AvailableSteps.find(step) == -1): AvailableSteps.append(step); ''' IsWork = WorkInProgress(workers); #AvailableSteps.pop(0); print("whileloop finished"); print("##################################"); def RemoveDupsOrder(TheString): a = ""; for letter in TheString: if not (letter in a): a += letter; return a; print(part1); part1 = RemoveDupsOrder(part1); print(part1); print("total time part2 = ", part2); #207 too low (because I forgot to add 60secs per step, fixed now #987 correct