Skip to content

Commit 96d5403

Browse files
committed
added 2018/day07
1 parent 8df4a24 commit 96d5403

File tree

3 files changed

+176
-1
lines changed

3 files changed

+176
-1
lines changed

2018/day07/input.txt

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
Step P must be finished before step R can begin.
2+
Step V must be finished before step J can begin.
3+
Step O must be finished before step K can begin.
4+
Step S must be finished before step W can begin.
5+
Step H must be finished before step E can begin.
6+
Step K must be finished before step Y can begin.
7+
Step B must be finished before step Z can begin.
8+
Step N must be finished before step G can begin.
9+
Step W must be finished before step I can begin.
10+
Step L must be finished before step Y can begin.
11+
Step U must be finished before step Q can begin.
12+
Step R must be finished before step Z can begin.
13+
Step Z must be finished before step E can begin.
14+
Step C must be finished before step I can begin.
15+
Step I must be finished before step Q can begin.
16+
Step D must be finished before step E can begin.
17+
Step A must be finished before step J can begin.
18+
Step G must be finished before step Y can begin.
19+
Step M must be finished before step T can begin.
20+
Step E must be finished before step X can begin.
21+
Step F must be finished before step T can begin.
22+
Step X must be finished before step J can begin.
23+
Step Y must be finished before step J can begin.
24+
Step T must be finished before step Q can begin.
25+
Step J must be finished before step Q can begin.
26+
Step E must be finished before step Y can begin.
27+
Step A must be finished before step T can begin.
28+
Step P must be finished before step H can begin.
29+
Step W must be finished before step R can begin.
30+
Step Y must be finished before step Q can begin.
31+
Step W must be finished before step M can begin.
32+
Step O must be finished before step M can begin.
33+
Step H must be finished before step R can begin.
34+
Step N must be finished before step L can begin.
35+
Step V must be finished before step W can begin.
36+
Step S must be finished before step Q can begin.
37+
Step D must be finished before step J can begin.
38+
Step W must be finished before step E can begin.
39+
Step V must be finished before step Y can begin.
40+
Step O must be finished before step C can begin.
41+
Step B must be finished before step T can begin.
42+
Step W must be finished before step T can begin.
43+
Step G must be finished before step T can begin.
44+
Step D must be finished before step T can begin.
45+
Step P must be finished before step E can begin.
46+
Step P must be finished before step J can begin.
47+
Step G must be finished before step E can begin.
48+
Step Z must be finished before step M can begin.
49+
Step K must be finished before step T can begin.
50+
Step H must be finished before step U can begin.
51+
Step P must be finished before step T can begin.
52+
Step W must be finished before step A can begin.
53+
Step A must be finished before step F can begin.
54+
Step F must be finished before step Y can begin.
55+
Step H must be finished before step M can begin.
56+
Step T must be finished before step J can begin.
57+
Step O must be finished before step S can begin.
58+
Step P must be finished before step M can begin.
59+
Step X must be finished before step T can begin.
60+
Step S must be finished before step J can begin.
61+
Step H must be finished before step C can begin.
62+
Step B must be finished before step W can begin.
63+
Step K must be finished before step N can begin.
64+
Step E must be finished before step T can begin.
65+
Step S must be finished before step Y can begin.
66+
Step C must be finished before step G can begin.
67+
Step R must be finished before step D can begin.
68+
Step N must be finished before step U can begin.
69+
Step O must be finished before step L can begin.
70+
Step B must be finished before step F can begin.
71+
Step S must be finished before step F can begin.
72+
Step X must be finished before step Y can begin.
73+
Step S must be finished before step D can begin.
74+
Step R must be finished before step E can begin.
75+
Step S must be finished before step A can begin.
76+
Step S must be finished before step X can begin.
77+
Step A must be finished before step G can begin.
78+
Step E must be finished before step F can begin.
79+
Step P must be finished before step A can begin.
80+
Step A must be finished before step M can begin.
81+
Step E must be finished before step Q can begin.
82+
Step H must be finished before step W can begin.
83+
Step W must be finished before step U can begin.
84+
Step F must be finished before step Q can begin.
85+
Step I must be finished before step J can begin.
86+
Step H must be finished before step G can begin.
87+
Step I must be finished before step G can begin.
88+
Step P must be finished before step X can begin.
89+
Step I must be finished before step D can begin.
90+
Step R must be finished before step X can begin.
91+
Step S must be finished before step I can begin.
92+
Step Y must be finished before step T can begin.
93+
Step R must be finished before step G can begin.
94+
Step I must be finished before step X can begin.
95+
Step B must be finished before step D can begin.
96+
Step X must be finished before step Q can begin.
97+
Step F must be finished before step X can begin.
98+
Step V must be finished before step R can begin.
99+
Step C must be finished before step J can begin.
100+
Step L must be finished before step Q can begin.
101+
Step K must be finished before step B can begin.

2018/day07/run.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#! /usr/bin/env python3
2+
3+
def load_data(filename):
4+
with open(filename, 'r') as f:
5+
for line in f:
6+
line = line.rstrip('\n')
7+
yield line[len("Step ")], line[len("Step . must be finished before step ")]
8+
9+
# Part One
10+
11+
reqs = list(load_data('input.txt'))
12+
13+
deps = {}
14+
15+
for must_be_finished_before, step in reqs:
16+
if step not in deps:
17+
deps[step] = set([ must_be_finished_before ])
18+
else:
19+
deps[step] |= set([ must_be_finished_before ])
20+
21+
if must_be_finished_before not in deps:
22+
deps[must_be_finished_before] = set([])
23+
24+
steps = ''
25+
26+
while set(deps.keys()) - set(steps):
27+
found = set([])
28+
for k, v in deps.items():
29+
if k in steps:
30+
continue
31+
if v - set(steps):
32+
continue
33+
found |= set(k)
34+
steps += sorted(found)[0]
35+
36+
print(steps)
37+
38+
# Part Two
39+
40+
max_workers = 5
41+
delay = lambda c: 61 + ord(c) - ord('A')
42+
in_workers = lambda: set( c for _, c in workers )
43+
steps = ''
44+
workers = []
45+
seconds = 0
46+
47+
while True:
48+
# Unload from workers
49+
for i, (s, c) in enumerate(list(workers)):
50+
if s == seconds:
51+
steps += c
52+
workers.remove( (s, c) )
53+
# Check if we are done
54+
if not set(deps.keys()) - set(steps):
55+
break
56+
# Find steps we can take
57+
found = set([])
58+
for k, v in deps.items():
59+
if k in steps:
60+
continue
61+
if k in in_workers():
62+
continue
63+
if v - set(steps):
64+
continue
65+
found |= set(k)
66+
# Load workers as much as we can
67+
while len(workers) < max_workers and found:
68+
c = list(found)[0]
69+
workers.append( (seconds + delay(c), c) )
70+
found -= set([c])
71+
seconds += 1
72+
73+
print(seconds)
74+

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
2015 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
33
2016 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
44
2017 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
5-
2018 ++ ++ ++ ++ ++ ++ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
5+
2018 ++ ++ ++ ++ ++ ++ ++ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
66
2019 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ -- ++ ++ -- +- ++ +- -
77
2020 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +- ++ ++ ++ ++ ++ +
88
2021 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +

0 commit comments

Comments
 (0)