From f3e239292ad9ca04fb7a7fc9f6c993af59b39b2c Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Sun, 4 Dec 2022 14:20:18 +0100 Subject: [PATCH] day7 --- answer_cache.json | 10 +++++ day07.py | 84 +++++++++++++++++++++++++++++++++++++ inputs/input7 | 101 +++++++++++++++++++++++++++++++++++++++++++++ inputs/input7_test | 7 ++++ skel_day.py | 4 +- 5 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 day07.py create mode 100644 inputs/input7 create mode 100644 inputs/input7_test diff --git a/answer_cache.json b/answer_cache.json index c47b32d..cdc86ba 100644 --- a/answer_cache.json +++ b/answer_cache.json @@ -63,5 +63,15 @@ "wrong": [], "correct": 39149 } + }, + "7": { + "1": { + "wrong": [], + "correct": "JMQZELVYXTIGPHFNSOADKWBRUC" + }, + "2": { + "wrong": [], + "correct": 1133 + } } } \ No newline at end of file diff --git a/day07.py b/day07.py new file mode 100644 index 0000000..b406238 --- /dev/null +++ b/day07.py @@ -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) diff --git a/inputs/input7 b/inputs/input7 new file mode 100644 index 0000000..e735c51 --- /dev/null +++ b/inputs/input7 @@ -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. diff --git a/inputs/input7_test b/inputs/input7_test new file mode 100644 index 0000000..1dfd2ea --- /dev/null +++ b/inputs/input7_test @@ -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. \ No newline at end of file diff --git a/skel_day.py b/skel_day.py index dcebd15..bf3331b 100644 --- a/skel_day.py +++ b/skel_day.py @@ -5,10 +5,10 @@ from typing import Any class Day(AOCDay): inputs = [ [ - (None, "input%DAY%") + (None, "input%DAY%"), ], [ - (None, "input%DAY%") + (None, "input%DAY%"), ] ]