#advent of code 2018 #day 07 #part 1 and 2 #very bad don't read #I had solutions for both parts in separate files #so I slapped a def function above all code with filename as an argument class elf: def WorkAssign(self,s): AocOffset = 60; self.WorkStep = s; self.WorkTime = ord(s) -64 + AocOffset; self.HasWork = True; def WorkReset(self): self.HasWork = False; self.WorkStep = ''; def DoWork(self): self.WorkTime += -1; def __init__(self): 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]]; def RemoveDupsOrder(TheString): a = ""; for letter in TheString: if not (letter in a): a += letter; return a; #part 2 def WorkTime(currentfilename): myinput = {}; numberofworkers = 5; f = open(currentfilename, 'r'); list2 = set(); for line in f: nowinstr = TransInstr(line); list2.add(nowinstr[0]); try: myinput[nowinstr[1]].append(nowinstr[0]); except: myinput[nowinstr[1]] = []; myinput[nowinstr[1]].append(nowinstr[0]); f.close(); CurrentStep = ''; workers = []; for i in range(numberofworkers): workers.append(elf()); AvailableSteps = []; for l in list2: IsUnique = True; for k in myinput.keys(): if (l == k): IsUnique = False; break; if IsUnique: AvailableSteps.append(l); part1 = ""; part2 = -1; IsWork = False; while (len(AvailableSteps) != 0 or IsWork): part2 += 1; AvailableSteps.sort(); for worker in workers: worker.DoWork(); if (worker.WorkTime == 0): part1 += worker.WorkStep; if (worker.WorkStep != ''): for step in myinput: try: myinput[step].pop(myinput[step].index(worker.WorkStep)); except: pass; CurrentStepsCheck = ""; for w in workers: CurrentStepsCheck += w.WorkStep; if (len(myinput[step]) == 0 and part1.find(step) == -1 and CurrentStepsCheck.find(step) == -1 ): AvailableSteps.append(step); worker.WorkReset(); AvailableSteps = list(dict.fromkeys(AvailableSteps)); for worker in workers: if not worker.HasWork: if (len(AvailableSteps) > 0): worker.WorkAssign(AvailableSteps[0]); AvailableSteps.pop(0); IsWork = WorkInProgress(workers); return part2; #part 1 def InstructionsOrder(currentfilename): myinput = {}; f = open(currentfilename, 'r'); list2 = set(); for line in f: nowinstr = TransInstr(line); list2.add(nowinstr[0]); try: myinput[nowinstr[1]].append(nowinstr[0]); except: myinput[nowinstr[1]] = []; myinput[nowinstr[1]].append(nowinstr[0]); f.close(); CurrentStep = ''; AvailableSteps = []; for l in list2: IsUnique = True; for k in myinput.keys(): if (l == k): IsUnique = False; break; if IsUnique: AvailableSteps.append(l); part1 = ""; while (len(AvailableSteps) != 0): AvailableSteps.sort(); CurrentStep = AvailableSteps[0]; part1 += 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): AvailableSteps.append(step); AvailableSteps.pop(0); return part1; myfilename = "07.in"; p1 = InstructionsOrder(myfilename); p1 = RemoveDupsOrder(p1); print("part 1 =",p1); p2 = WorkTime(myfilename); print("part 2 =", p2);