day7
This commit is contained in:
parent
dbbf97c64d
commit
f3e239292a
@ -63,5 +63,15 @@
|
|||||||
"wrong": [],
|
"wrong": [],
|
||||||
"correct": 39149
|
"correct": 39149
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"1": {
|
||||||
|
"wrong": [],
|
||||||
|
"correct": "JMQZELVYXTIGPHFNSOADKWBRUC"
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"wrong": [],
|
||||||
|
"correct": 1133
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
84
day07.py
Normal file
84
day07.py
Normal 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
101
inputs/input7
Normal 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
7
inputs/input7_test
Normal 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.
|
||||||
@ -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%"),
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user