Skip to content

Commit 946ec9b

Browse files
committed
2018 Day 7
1 parent 6a545d1 commit 946ec9b

File tree

4 files changed

+244
-0
lines changed

4 files changed

+244
-0
lines changed

2018/7.txt

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

2018/7a.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""
2+
This one didn't work out! See 7a_2nd_try.py for a working solution.
3+
"""
4+
5+
6+
class Level:
7+
def __init__(self, name):
8+
self.prev = None
9+
self.next = None
10+
self.letters = []
11+
12+
def search_together(self, name):
13+
return name in self.letters
14+
15+
def search_before(self, name):
16+
if self.prev:
17+
if self.prev.search_together(name):
18+
return True
19+
return self.prev.search_before(name)
20+
else:
21+
return False
22+
23+
def search_after(self, name):
24+
if self.next:
25+
if self.next.search_together(name):
26+
return True
27+
return self.next.search_after(name)
28+
else:
29+
return False
30+
31+
32+
class Leveller:
33+
def __init__(self):
34+
self.start_level = Level()
35+
# {name: Node object in the tree}
36+
self.d = {}
37+
38+
def add(self, antacedent, consequent):
39+
self.levels.append()
40+
41+
42+
t = Tree()
43+
with open("7.txt") as f:
44+
for l in f:
45+
antacedent = l[5]
46+
consequent = l[36]

2018/7a_2nd_try.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from collections import defaultdict
2+
from pprint import pprint
3+
4+
# d = {consequent: set of prerequisites}
5+
d = defaultdict(set)
6+
7+
with open("7.txt") as f:
8+
for l in f:
9+
antacedent = l[5]
10+
consequent = l[36]
11+
d[consequent].add(antacedent)
12+
if antacedent not in d:
13+
d[antacedent] = set()
14+
15+
sequence = []
16+
17+
# pprint(d)
18+
19+
while d:
20+
# find items without requirements:
21+
no_req = [(cons, req) for cons, req in d.items() if not req]
22+
# sort them alphabetically
23+
no_req.sort(key=lambda x: x[0])
24+
# add the FIRST one to the sequence! (because other ones may meanwhile
25+
# become available
26+
sequence.append(no_req[0][0])
27+
# pprint(sequence)
28+
# remove it from the d
29+
del d[no_req[0][0]]
30+
# remove them from values in d:
31+
for antacedents in d.values():
32+
antacedents.discard(no_req[0][0])
33+
34+
print("".join(sequence))

2018/7b.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from collections import defaultdict, namedtuple
2+
from pprint import pprint
3+
4+
# d = {consequent: set of prerequisites}
5+
d = defaultdict(set)
6+
7+
with open("7.txt") as f:
8+
for l in f:
9+
antacedent = l[5]
10+
consequent = l[36]
11+
d[consequent].add(antacedent)
12+
if antacedent not in d:
13+
d[antacedent] = set()
14+
15+
sequence = []
16+
17+
pprint(d)
18+
19+
second = 0
20+
workers = []
21+
Worker = namedtuple("Worker", ("min_left", "letter"))
22+
for i in range(5):
23+
workers.append({"min_left": 0, "letter": None})
24+
25+
while True:
26+
# lower counters of workers
27+
for w in workers:
28+
if w["letter"] is not None:
29+
w["min_left"] -= 1
30+
31+
# record finished workers and prepare them for work
32+
for w in workers:
33+
if w["min_left"] == 0 and w["letter"] is not None:
34+
sequence.append(w["letter"])
35+
# since one letter was finished, we can remove it from requirements
36+
for antacedents in d.values():
37+
antacedents.discard(w["letter"])
38+
w["letter"] = None
39+
40+
if not d and not tuple(w for w in workers if w["letter"] is not None):
41+
print(second)
42+
break
43+
44+
# find items without requirements:
45+
no_req = [(cons, req) for cons, req in d.items() if not req]
46+
# sort them alphabetically
47+
no_req.sort(key=lambda x: x[0])
48+
49+
# Add them to free workers
50+
for l, *_ in no_req:
51+
for w in workers:
52+
if w["letter"] is None:
53+
w["letter"] = l
54+
w["min_left"] = 60 + ord(l) - ord("A") + 1
55+
# letter is assigned to someone, we delete it from the list
56+
del d[w["letter"]]
57+
break
58+
59+
# print(f'{second} {workers[0]} {workers[1]} {workers[2]} {workers[3]} {workers[4]}')
60+
61+
second += 1
62+
63+
print("".join(sequence))

0 commit comments

Comments
 (0)