This commit is contained in:
Stefan Harmuth 2022-12-04 14:20:18 +01:00
parent dbbf97c64d
commit f3e239292a
5 changed files with 204 additions and 2 deletions

View File

@ -63,5 +63,15 @@
"wrong": [], "wrong": [],
"correct": 39149 "correct": 39149
} }
},
"7": {
"1": {
"wrong": [],
"correct": "JMQZELVYXTIGPHFNSOADKWBRUC"
},
"2": {
"wrong": [],
"correct": 1133
}
} }
} }

84
day07.py Normal file
View File

@ -0,0 +1,84 @@
from tools.aoc import AOCDay
from typing import Any
def get_available_steps(steps: dict) -> list:
return [x for x in steps if len(steps[x]) == 0]
class Day(AOCDay):
inputs = [
[
("CABDFE", "input7_test"),
("JMQZELVYXTIGPHFNSOADKWBRUC", "input7"),
],
[
(15, "input7_test"),
(1133, "input7"),
]
]
def get_step_blocker(self) -> dict:
steps = {}
for line in self.getInput():
tmp = line.split(" ")
step_done, step_begin = tmp[1], tmp[7]
if step_begin not in steps:
steps[step_begin] = []
if step_done not in steps:
steps[step_done] = []
steps[step_begin].append(step_done)
return steps
def part1(self) -> Any:
steps = self.get_step_blocker()
step_order = ""
while next_steps := get_available_steps(steps):
next_step = min(next_steps)
step_order += next_step
del steps[next_step]
for x in steps:
if next_step in steps[x]:
steps[x].remove(next_step)
return step_order
def part2(self) -> Any:
steps = self.get_step_blocker()
second = 0
time_add = 0 if self._current_test_file.endswith("test") else 60
worker_count = 2 if self._current_test_file.endswith("test") else 5
step_order = ""
current_work = []
while second == 0 or current_work:
new_work = []
for work in current_work:
if work[1] - 1 == 0:
step_order += work[0]
for x in steps:
if work[0] in steps[x]:
steps[x].remove(work[0])
else:
new_work.append([work[0], work[1] - 1])
current_work = new_work
second += 1
if len(current_work) < worker_count:
available_worker = worker_count - len(current_work)
avaiable_work = get_available_steps(steps)
while avaiable_work and available_worker:
next_step = min(avaiable_work)
del steps[next_step]
avaiable_work.remove(next_step)
current_work.append([next_step, ord(next_step) - 64 + time_add])
available_worker -= 1
return second - 1
if __name__ == '__main__':
day = Day(2018, 7)
day.run(verbose=True)

101
inputs/input7 Normal file
View File

@ -0,0 +1,101 @@
Step Z must be finished before step V can begin.
Step V must be finished before step K can begin.
Step M must be finished before step Q can begin.
Step E must be finished before step X can begin.
Step J must be finished before step W can begin.
Step L must be finished before step O can begin.
Step Q must be finished before step T can begin.
Step Y must be finished before step P can begin.
Step X must be finished before step R can begin.
Step T must be finished before step U can begin.
Step I must be finished before step O can begin.
Step P must be finished before step H can begin.
Step G must be finished before step A can begin.
Step N must be finished before step A can begin.
Step H must be finished before step B can begin.
Step F must be finished before step D can begin.
Step S must be finished before step O can begin.
Step O must be finished before step W can begin.
Step D must be finished before step U can begin.
Step W must be finished before step B can begin.
Step A must be finished before step K can begin.
Step B must be finished before step R can begin.
Step K must be finished before step C can begin.
Step R must be finished before step C can begin.
Step U must be finished before step C can begin.
Step A must be finished before step U can begin.
Step J must be finished before step I can begin.
Step D must be finished before step K can begin.
Step V must be finished before step S can begin.
Step H must be finished before step C can begin.
Step R must be finished before step U can begin.
Step I must be finished before step G can begin.
Step D must be finished before step R can begin.
Step M must be finished before step B can begin.
Step G must be finished before step R can begin.
Step M must be finished before step I can begin.
Step G must be finished before step N can begin.
Step M must be finished before step N can begin.
Step Q must be finished before step S can begin.
Step I must be finished before step S can begin.
Step J must be finished before step R can begin.
Step O must be finished before step B can begin.
Step G must be finished before step S can begin.
Step J must be finished before step C can begin.
Step M must be finished before step D can begin.
Step T must be finished before step H can begin.
Step P must be finished before step N can begin.
Step S must be finished before step K can begin.
Step T must be finished before step C can begin.
Step J must be finished before step A can begin.
Step G must be finished before step F can begin.
Step N must be finished before step R can begin.
Step N must be finished before step W can begin.
Step T must be finished before step I can begin.
Step S must be finished before step B can begin.
Step H must be finished before step F can begin.
Step B must be finished before step C can begin.
Step L must be finished before step W can begin.
Step N must be finished before step O can begin.
Step O must be finished before step A can begin.
Step H must be finished before step S can begin.
Step F must be finished before step A can begin.
Step F must be finished before step C can begin.
Step M must be finished before step A can begin.
Step Z must be finished before step H can begin.
Step Z must be finished before step L can begin.
Step E must be finished before step H can begin.
Step X must be finished before step T can begin.
Step Y must be finished before step X can begin.
Step E must be finished before step W can begin.
Step P must be finished before step R can begin.
Step Z must be finished before step E can begin.
Step W must be finished before step C can begin.
Step I must be finished before step P can begin.
Step X must be finished before step A can begin.
Step Y must be finished before step C can begin.
Step I must be finished before step F can begin.
Step L must be finished before step T can begin.
Step A must be finished before step B can begin.
Step F must be finished before step W can begin.
Step T must be finished before step R can begin.
Step X must be finished before step F can begin.
Step M must be finished before step O can begin.
Step N must be finished before step K can begin.
Step T must be finished before step S can begin.
Step J must be finished before step N can begin.
Step J must be finished before step S can begin.
Step O must be finished before step D can begin.
Step T must be finished before step P can begin.
Step Z must be finished before step D can begin.
Step L must be finished before step X can begin.
Step Q must be finished before step G can begin.
Step M must be finished before step G can begin.
Step P must be finished before step W can begin.
Step V must be finished before step P can begin.
Step D must be finished before step B can begin.
Step Y must be finished before step D can begin.
Step X must be finished before step S can begin.
Step K must be finished before step U can begin.
Step Z must be finished before step Y can begin.
Step D must be finished before step W can begin.

7
inputs/input7_test Normal file
View File

@ -0,0 +1,7 @@
Step C must be finished before step A can begin.
Step C must be finished before step F can begin.
Step A must be finished before step B can begin.
Step A must be finished before step D can begin.
Step B must be finished before step E can begin.
Step D must be finished before step E can begin.
Step F must be finished before step E can begin.

View File

@ -5,10 +5,10 @@ from typing import Any
class Day(AOCDay): class Day(AOCDay):
inputs = [ inputs = [
[ [
(None, "input%DAY%") (None, "input%DAY%"),
], ],
[ [
(None, "input%DAY%") (None, "input%DAY%"),
] ]
] ]