From f6ff66ea2da1f30303f17a2dac341411fb325881 Mon Sep 17 00:00:00 2001 From: blenovo Date: Sat, 16 Aug 2025 00:38:26 +0200 Subject: final puzzle and little cleanup for 2018 --- 2018/aoc2018-d07.py | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 2018/aoc2018-d07.py (limited to '2018/aoc2018-d07.py') diff --git a/2018/aoc2018-d07.py b/2018/aoc2018-d07.py new file mode 100644 index 0000000..e7de018 --- /dev/null +++ b/2018/aoc2018-d07.py @@ -0,0 +1,157 @@ +#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); -- cgit v1.2.3