another coding evening
This commit is contained in:
101
07/input.txt
Normal file
101
07/input.txt
Normal file
@ -0,0 +1,101 @@
|
||||
Step S must be finished before step B can begin.
|
||||
Step B must be finished before step Y can begin.
|
||||
Step R must be finished before step E can begin.
|
||||
Step H must be finished before step M can begin.
|
||||
Step C must be finished before step F can begin.
|
||||
Step K must be finished before step A can begin.
|
||||
Step V must be finished before step W can begin.
|
||||
Step W must be finished before step L can begin.
|
||||
Step J must be finished before step L can begin.
|
||||
Step Q must be finished before step A can begin.
|
||||
Step U must be finished before step L can begin.
|
||||
Step Y must be finished before step M can begin.
|
||||
Step T must be finished before step F can begin.
|
||||
Step D must be finished before step A can begin.
|
||||
Step I must be finished before step M can begin.
|
||||
Step O must be finished before step P can begin.
|
||||
Step A must be finished before step L can begin.
|
||||
Step P must be finished before step N can begin.
|
||||
Step X must be finished before step Z can begin.
|
||||
Step G must be finished before step N can begin.
|
||||
Step M must be finished before step F can begin.
|
||||
Step N must be finished before step L can begin.
|
||||
Step F must be finished before step Z can begin.
|
||||
Step Z must be finished before step E can begin.
|
||||
Step E must be finished before step L can begin.
|
||||
Step O must be finished before step X can begin.
|
||||
Step B must be finished before step V can begin.
|
||||
Step H must be finished before step Q can begin.
|
||||
Step T must be finished before step M can begin.
|
||||
Step A must be finished before step G can begin.
|
||||
Step R must be finished before step H can begin.
|
||||
Step S must be finished before step C can begin.
|
||||
Step N must be finished before step Z can begin.
|
||||
Step Z must be finished before step L can begin.
|
||||
Step Q must be finished before step Z can begin.
|
||||
Step R must be finished before step G can begin.
|
||||
Step P must be finished before step Z can begin.
|
||||
Step U must be finished before step M can begin.
|
||||
Step W must be finished before step D can begin.
|
||||
Step F must be finished before step L can begin.
|
||||
Step D must be finished before step P can begin.
|
||||
Step I must be finished before step E can begin.
|
||||
Step M must be finished before step E can begin.
|
||||
Step H must be finished before step N can begin.
|
||||
Step F must be finished before step E can begin.
|
||||
Step D must be finished before step L can begin.
|
||||
Step C must be finished before step E can begin.
|
||||
Step H must be finished before step Z can begin.
|
||||
Step W must be finished before step Q can begin.
|
||||
Step X must be finished before step E can begin.
|
||||
Step G must be finished before step M can begin.
|
||||
Step X must be finished before step M can begin.
|
||||
Step Y must be finished before step P can begin.
|
||||
Step S must be finished before step I can begin.
|
||||
Step P must be finished before step X can begin.
|
||||
Step S must be finished before step T can begin.
|
||||
Step I must be finished before step N can begin.
|
||||
Step P must be finished before step L can begin.
|
||||
Step C must be finished before step X can begin.
|
||||
Step I must be finished before step G can begin.
|
||||
Step O must be finished before step F can begin.
|
||||
Step I must be finished before step X can begin.
|
||||
Step C must be finished before step Z can begin.
|
||||
Step B must be finished before step K can begin.
|
||||
Step T must be finished before step P can begin.
|
||||
Step Q must be finished before step X can begin.
|
||||
Step M must be finished before step N can begin.
|
||||
Step H must be finished before step O can begin.
|
||||
Step Q must be finished before step M can begin.
|
||||
Step U must be finished before step F can begin.
|
||||
Step Y must be finished before step O can begin.
|
||||
Step D must be finished before step O can begin.
|
||||
Step R must be finished before step T can begin.
|
||||
Step A must be finished before step E can begin.
|
||||
Step A must be finished before step M can begin.
|
||||
Step C must be finished before step N can begin.
|
||||
Step G must be finished before step E can begin.
|
||||
Step C must be finished before step Y can begin.
|
||||
Step A must be finished before step Z can begin.
|
||||
Step S must be finished before step X can begin.
|
||||
Step V must be finished before step Z can begin.
|
||||
Step Q must be finished before step I can begin.
|
||||
Step P must be finished before step E can begin.
|
||||
Step D must be finished before step F can begin.
|
||||
Step M must be finished before step Z can begin.
|
||||
Step U must be finished before step N can begin.
|
||||
Step Q must be finished before step L can begin.
|
||||
Step O must be finished before step Z can begin.
|
||||
Step N must be finished before step E can begin.
|
||||
Step S must be finished before step W can begin.
|
||||
Step S must be finished before step O can begin.
|
||||
Step U must be finished before step T can begin.
|
||||
Step A must be finished before step P can begin.
|
||||
Step J must be finished before step I can begin.
|
||||
Step A must be finished before step F can begin.
|
||||
Step U must be finished before step D can begin.
|
||||
Step W must be finished before step X can begin.
|
||||
Step O must be finished before step L can begin.
|
||||
Step J must be finished before step D can begin.
|
||||
Step R must be finished before step Z can begin.
|
||||
Step O must be finished before step N can begin.
|
||||
7
07/input_sample.txt
Normal file
7
07/input_sample.txt
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.
|
||||
44
07/solve01.py
Executable file
44
07/solve01.py
Executable file
@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import re
|
||||
|
||||
RE_LINE = re.compile('^Step (.*) must be finished before step (.*) can begin.')
|
||||
tree = dict()
|
||||
|
||||
def read_input():
|
||||
with open('input.txt', 'r') as f:
|
||||
for line in f:
|
||||
yield line
|
||||
|
||||
def add_dependency(a, b):
|
||||
if a not in tree:
|
||||
tree[a] = {
|
||||
'node': a,
|
||||
'parent': '',
|
||||
'child': '',
|
||||
}
|
||||
if b not in tree:
|
||||
tree[b] = {
|
||||
'node': b,
|
||||
'parent': '',
|
||||
'child': '',
|
||||
}
|
||||
tree[a]['child'] += b
|
||||
tree[b]['parent'] += a
|
||||
|
||||
for l in read_input():
|
||||
m = RE_LINE.match(l)
|
||||
if m is None:
|
||||
raise Exception('unpaseable line')
|
||||
add_dependency(m.group(1), m.group(2))
|
||||
|
||||
result = []
|
||||
while len(tree):
|
||||
root = min([ n['node'] for n in tree.values() if len(n['parent']) == 0])
|
||||
for c in tree[root]['child']:
|
||||
tree[c]['parent'] = tree[c]['parent'].replace(root, "")
|
||||
del tree[root]
|
||||
result.append(root)
|
||||
|
||||
|
||||
print(''.join(result))
|
||||
71
07/solve02.py
Executable file
71
07/solve02.py
Executable file
@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import re
|
||||
|
||||
RE_LINE = re.compile('^Step (.*) must be finished before step (.*) can begin.')
|
||||
WORKERS=5
|
||||
JOB_TIME=60
|
||||
tree = dict()
|
||||
|
||||
def read_input():
|
||||
with open('input.txt', 'r') as f:
|
||||
for line in f:
|
||||
yield line
|
||||
|
||||
def add_dependency(a, b):
|
||||
if a not in tree:
|
||||
tree[a] = {
|
||||
'node': a,
|
||||
'parent': '',
|
||||
'child': '',
|
||||
'time': JOB_TIME+ord(a)-64
|
||||
}
|
||||
if b not in tree:
|
||||
tree[b] = {
|
||||
'node': b,
|
||||
'parent': '',
|
||||
'child': '',
|
||||
'time': JOB_TIME+ord(b)-64
|
||||
}
|
||||
tree[a]['child'] += b
|
||||
tree[b]['parent'] += a
|
||||
|
||||
for l in read_input():
|
||||
m = RE_LINE.match(l)
|
||||
if m is None:
|
||||
raise Exception('unpaseable line')
|
||||
add_dependency(m.group(1), m.group(2))
|
||||
|
||||
worker = [[0, None]] * WORKERS # time and job
|
||||
total_time = 0
|
||||
while len(tree):
|
||||
# finish worker job
|
||||
try:
|
||||
min_time = min([x[0] for x in worker if x[0]>0])
|
||||
total_time = min_time
|
||||
except ValueError:
|
||||
min_time = -1
|
||||
min_workers = [ k for k,v in enumerate(worker) if v[0] == min_time]
|
||||
for w in min_workers:
|
||||
job = worker[w][1]
|
||||
if job is None:
|
||||
continue
|
||||
for c in tree[job]['child']:
|
||||
tree[c]['parent'] = tree[c]['parent'].replace(job, "")
|
||||
del tree[job]
|
||||
worker[w] = [0, None]
|
||||
print('finish job for {}({})'.format(w, job))
|
||||
|
||||
# add new job
|
||||
roots = sorted([ n['node'] for n in tree.values() if len(n['parent']) == 0 and n['time']>0])
|
||||
empty_w = [ k for k,v in enumerate(worker) if v[1] is None]
|
||||
for w in empty_w:
|
||||
if len(roots) == 0:
|
||||
break
|
||||
job = roots.pop(0)
|
||||
worker[w] = (total_time+tree[job]['time'], job)
|
||||
tree[job]['time'] = 0
|
||||
print('added job for {}({})'.format(w, job))
|
||||
|
||||
|
||||
print(total_time)
|
||||
Reference in New Issue
Block a user