diff options
| author | blenovo <bk@gmail.com> | 2025-08-16 00:38:26 +0200 |
|---|---|---|
| committer | blenovo <bk@gmail.com> | 2025-08-16 00:38:26 +0200 |
| commit | f6ff66ea2da1f30303f17a2dac341411fb325881 (patch) | |
| tree | 934b79fc762547e474a5277723c0c5087b56698f /2018/aoc2018-d07.py | |
| parent | edf82358166db84f74419f9a83d328390cc6b356 (diff) | |
final puzzle and little cleanup for 2018blen
Diffstat (limited to '2018/aoc2018-d07.py')
| -rw-r--r-- | 2018/aoc2018-d07.py | 157 |
1 files changed, 157 insertions, 0 deletions
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);
|
