From bf0aa772604e24573715518800e1a4b5db2f7a78 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Fri, 7 Dec 2018 16:19:15 +1030 Subject: [PATCH] 2018 Day 7 --- 2018/day7-input | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 2018/day7.py | 73 ++++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 2018/day7-input create mode 100644 2018/day7.py diff --git a/2018/day7-input b/2018/day7-input new file mode 100644 index 0000000..41e50b9 --- /dev/null +++ b/2018/day7-input @@ -0,0 +1,101 @@ +Step C must be finished before step P can begin. +Step V must be finished before step Q can begin. +Step T must be finished before step X can begin. +Step B must be finished before step U can begin. +Step Z must be finished before step O can begin. +Step P must be finished before step I can begin. +Step D must be finished before step G can begin. +Step A must be finished before step Y can begin. +Step R must be finished before step O can begin. +Step J must be finished before step E can begin. +Step N must be finished before step S can begin. +Step X must be finished before step H can begin. +Step F must be finished before step L can begin. +Step S must be finished before step I can begin. +Step W must be finished before step Q can begin. +Step H must be finished before step K can begin. +Step K must be finished before step Q can begin. +Step E must be finished before step L can begin. +Step Q must be finished before step O can begin. +Step U must be finished before step G can begin. +Step L must be finished before step O can begin. +Step Y must be finished before step G can begin. +Step G must be finished before step I can begin. +Step M must be finished before step I can begin. +Step I must be finished before step O can begin. +Step A must be finished before step N can begin. +Step H must be finished before step O can begin. +Step T must be finished before step O can begin. +Step H must be finished before step U can begin. +Step A must be finished before step I can begin. +Step B must be finished before step R can begin. +Step V must be finished before step T can begin. +Step H must be finished before step M can begin. +Step C must be finished before step A can begin. +Step B must be finished before step G can begin. +Step L must be finished before step Y can begin. +Step T must be finished before step J can begin. +Step A must be finished before step R can begin. +Step X must be finished before step L can begin. +Step B must be finished before step L can begin. +Step A must be finished before step F can begin. +Step K must be finished before step O can begin. +Step W must be finished before step M can begin. +Step Z must be finished before step N can begin. +Step Z must be finished before step S can begin. +Step R must be finished before step K can begin. +Step Q must be finished before step L can begin. +Step G must be finished before step O can begin. +Step F must be finished before step Y can begin. +Step V must be finished before step H can begin. +Step E must be finished before step I can begin. +Step W must be finished before step Y can begin. +Step U must be finished before step I can begin. +Step F must be finished before step K can begin. +Step M must be finished before step O can begin. +Step Z must be finished before step H can begin. +Step X must be finished before step S can begin. +Step J must be finished before step O can begin. +Step B must be finished before step I can begin. +Step F must be finished before step H can begin. +Step D must be finished before step U can begin. +Step E must be finished before step M can begin. +Step Z must be finished before step X can begin. +Step P must be finished before step L can begin. +Step W must be finished before step H can begin. +Step C must be finished before step D can begin. +Step A must be finished before step X can begin. +Step Q must be finished before step I can begin. +Step R must be finished before step Y can begin. +Step B must be finished before step A can begin. +Step N must be finished before step L can begin. +Step H must be finished before step G can begin. +Step Y must be finished before step M can begin. +Step L must be finished before step G can begin. +Step G must be finished before step M can begin. +Step Z must be finished before step R can begin. +Step S must be finished before step Q can begin. +Step P must be finished before step J can begin. +Step V must be finished before step J can begin. +Step J must be finished before step I can begin. +Step J must be finished before step X can begin. +Step W must be finished before step O can begin. +Step B must be finished before step F can begin. +Step R must be finished before step M can begin. +Step V must be finished before step S can begin. +Step H must be finished before step E can begin. +Step E must be finished before step U can begin. +Step R must be finished before step W can begin. +Step X must be finished before step Q can begin. +Step N must be finished before step G can begin. +Step T must be finished before step I can begin. +Step L must be finished before step M can begin. +Step H must be finished before step I can begin. +Step U must be finished before step M can begin. +Step C must be finished before step H can begin. +Step P must be finished before step H can begin. +Step J must be finished before step F can begin. +Step A must be finished before step O can begin. +Step X must be finished before step M can begin. +Step H must be finished before step L can begin. +Step W must be finished before step K can begin. diff --git a/2018/day7.py b/2018/day7.py new file mode 100644 index 0000000..39624e6 --- /dev/null +++ b/2018/day7.py @@ -0,0 +1,73 @@ +with open('day7-input', 'r') as file: + data = [l.strip('\n') for l in file] + +steps = set() +step_deps = {} +for line in data: + s = line.split() + step1 = s[1] + step2 = s[-3] + steps.add(step1) + steps.add(step2) + if step2 in step_deps: + step_deps[step2] += step1 + else: + step_deps[step2] = [step1] + +queue = [step for step in steps] +step_deps_1 = step_deps.copy() +completed_steps = set() +ready_steps = set() +output = [] +while queue: + for step in queue: + if step not in step_deps_1: + ready_steps.add(step) + else: + deps = [d for d in step_deps_1[step] if d not in completed_steps] + if len(deps) > 0: + step_deps_1[step] = deps + else: + ready_steps.add(step) + step_deps_1.pop(step) + for step in sorted(ready_steps)[:1]: + completed_steps.add(step) + output += step + queue.remove(step) + break + ready_steps = set() +print(''.join(output)) # Part 1 + +unprocessed_steps = steps.copy() +step_deps_2 = step_deps.copy() +completed_steps_2 = set() +ready_steps_2 = set() +waiting_steps = {} +time = 0 +while unprocessed_steps: + for k in list(waiting_steps.keys()): + waiting_steps[k] -= 1 + if waiting_steps[k] < 1: + completed_steps_2.add(k) + print(f'{time:04}: Step {k} complete!') # Debug + waiting_steps.pop(k) + for step in unprocessed_steps-ready_steps_2: + if step not in step_deps_2: + ready_steps_2.add(step) + else: + deps = [d for d in step_deps_2[step] if d not in completed_steps_2] + if len(deps) > 0: + step_deps_2[step] = deps + else: + ready_steps_2.add(step) + step_deps_2.pop(step) + for step in list(sorted(ready_steps_2)): + if len(waiting_steps) >= 5: # Only 5 workers + break + waiting_steps[step] = 60 + ord(step)-64 + print(f'{time:04}: Starting step {step}! ({waiting_steps[step]} seconds remain)') # Debug + unprocessed_steps.remove(step) + ready_steps_2.remove(step) + time += 1 +time += max(waiting_steps.values()) - 1 # t got moved forward 1 at end of while loop +print(time) # Part 2