Added 2018 day 7
This commit is contained in:
parent
0723fd7dd2
commit
506b86a7a8
108
2018/day07.py
Normal file
108
2018/day07.py
Normal file
@ -0,0 +1,108 @@
|
||||
""" https://adventofcode.com/2018/day/5 """
|
||||
|
||||
def readFile():
|
||||
import os.path as p
|
||||
dName = p.dirname(__file__)
|
||||
fName = p.basename(__file__).split(".")[0]
|
||||
|
||||
nodes = {}
|
||||
with open(p.join(dName, "input", f"{fName}.txt"), "r") as f:
|
||||
lines = [(line[5:6], line[36:37]) for line in f.readlines()]
|
||||
for l in lines:
|
||||
if l[0] not in nodes:
|
||||
nodes[l[0]] = Node(l[0])
|
||||
if l[1] not in nodes:
|
||||
nodes[l[1]] = Node(l[1])
|
||||
nodes[l[0]].children.append(nodes[l[1]])
|
||||
nodes[l[1]].parents.append(nodes[l[0]])
|
||||
return nodes
|
||||
|
||||
class Node:
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.parents = []
|
||||
self.children = []
|
||||
self.timeNeeded = ord(name) - 4
|
||||
|
||||
class Worker:
|
||||
def __init__(self):
|
||||
self.working = False
|
||||
self.node = None
|
||||
self.time = 0
|
||||
|
||||
def work(self):
|
||||
self.time -= 1
|
||||
if self.time == 0:
|
||||
self.working = False
|
||||
|
||||
def setNode(self, node):
|
||||
self.node = node
|
||||
self.working = True
|
||||
self.time = self.node.timeNeeded
|
||||
|
||||
def getStartNodes(vals):
|
||||
l = []
|
||||
for val in vals:
|
||||
if len(vals[val].parents) == 0:
|
||||
l.append(vals[val])
|
||||
return l
|
||||
|
||||
def selectNextNode(vals):
|
||||
minVal, minIdx = None, -1
|
||||
for i in range(len(vals)):
|
||||
if minVal is None or ord(vals[i].name) < minVal:
|
||||
minVal, minIdx = ord(vals[i].name), i
|
||||
return vals[minIdx]
|
||||
|
||||
def part1(vals):
|
||||
order = []
|
||||
nodes = getStartNodes(vals)
|
||||
while nodes:
|
||||
n = selectNextNode(nodes)
|
||||
nodes.remove(n)
|
||||
order.append(n.name)
|
||||
for child in n.children:
|
||||
child.parents.remove(n)
|
||||
if len(child.parents) == 0:
|
||||
nodes.append(child)
|
||||
return "".join(order)
|
||||
|
||||
def stillWorking(worker):
|
||||
for w in worker:
|
||||
if w.working:
|
||||
return True
|
||||
return False
|
||||
|
||||
def part2(vals, numOfWorker):
|
||||
order = []
|
||||
time = 0
|
||||
nodes = getStartNodes(vals)
|
||||
worker = [Worker() for i in range(numOfWorker)]
|
||||
while nodes or stillWorking(worker):
|
||||
temp = []
|
||||
for w in worker:
|
||||
if not w.working:
|
||||
if len(nodes) == 0:
|
||||
continue
|
||||
else:
|
||||
n = selectNextNode(nodes)
|
||||
w.setNode(n)
|
||||
nodes.remove(n)
|
||||
if w.working:
|
||||
w.work()
|
||||
if not w.working:
|
||||
# finished working
|
||||
order.append(w.node.name)
|
||||
for child in w.node.children:
|
||||
child.parents.remove(w.node)
|
||||
if len(child.parents) == 0:
|
||||
temp.append(child)
|
||||
nodes += temp
|
||||
time += 1
|
||||
return time
|
||||
|
||||
if __name__ == "__main__":
|
||||
vals = readFile()
|
||||
print(f"Part 1: {part1(vals)}")
|
||||
vals = readFile()
|
||||
print(f"Part 2: {part2(vals, 5)}")
|
101
2018/input/day07.txt
Normal file
101
2018/input/day07.txt
Normal file
@ -0,0 +1,101 @@
|
||||
Step F must be finished before step Q can begin.
|
||||
Step A must be finished before step K can begin.
|
||||
Step K must be finished before step R can begin.
|
||||
Step D must be finished before step X can begin.
|
||||
Step L must be finished before step T can begin.
|
||||
Step V must be finished before step W can begin.
|
||||
Step J must be finished before step N can begin.
|
||||
Step B must be finished before step W can begin.
|
||||
Step X must be finished before step C can begin.
|
||||
Step W must be finished before step I can begin.
|
||||
Step Q must be finished before step P can begin.
|
||||
Step E must be finished before step M can begin.
|
||||
Step C must be finished before step N can begin.
|
||||
Step U must be finished before step O can begin.
|
||||
Step O must be finished before step R can begin.
|
||||
Step N must be finished before step Z can begin.
|
||||
Step R must be finished before step I can begin.
|
||||
Step G must be finished before step H can begin.
|
||||
Step T must be finished before step H can begin.
|
||||
Step M must be finished before step P can begin.
|
||||
Step Y must be finished before step I can begin.
|
||||
Step S must be finished before step Z can begin.
|
||||
Step I must be finished before step H can begin.
|
||||
Step H must be finished before step P can begin.
|
||||
Step P must be finished before step Z can begin.
|
||||
Step Y must be finished before step P can begin.
|
||||
Step A must be finished before step O can begin.
|
||||
Step V must be finished before step O can begin.
|
||||
Step G must be finished before step Y can begin.
|
||||
Step K must be finished before step B can begin.
|
||||
Step I must be finished before step P can begin.
|
||||
Step D must be finished before step L can begin.
|
||||
Step A must be finished before step P can begin.
|
||||
Step O must be finished before step T can begin.
|
||||
Step F must be finished before step C can begin.
|
||||
Step M must be finished before step S can begin.
|
||||
Step V must be finished before step Q can begin.
|
||||
Step G must be finished before step I can begin.
|
||||
Step O must be finished before step I can begin.
|
||||
Step N must be finished before step I can begin.
|
||||
Step E must be finished before step O can begin.
|
||||
Step N must be finished before step S can begin.
|
||||
Step J must be finished before step H can begin.
|
||||
Step C must be finished before step P can begin.
|
||||
Step E must be finished before step N can begin.
|
||||
Step T must be finished before step P can begin.
|
||||
Step A must be finished before step G can begin.
|
||||
Step A must be finished before step V can begin.
|
||||
Step C must be finished before step H can begin.
|
||||
Step A must be finished before step Y can begin.
|
||||
Step E must be finished before step U can begin.
|
||||
Step T must be finished before step Y can begin.
|
||||
Step Q must be finished before step S can begin.
|
||||
Step Y must be finished before step S can begin.
|
||||
Step E must be finished before step P can begin.
|
||||
Step N must be finished before step T can begin.
|
||||
Step T must be finished before step M can begin.
|
||||
Step Q must be finished before step M can begin.
|
||||
Step H must be finished before step Z can begin.
|
||||
Step D must be finished before step Y can begin.
|
||||
Step J must be finished before step R can begin.
|
||||
Step U must be finished before step R can begin.
|
||||
Step K must be finished before step N can begin.
|
||||
Step A must be finished before step W can begin.
|
||||
Step A must be finished before step H can begin.
|
||||
Step X must be finished before step G can begin.
|
||||
Step V must be finished before step J can begin.
|
||||
Step W must be finished before step C can begin.
|
||||
Step I must be finished before step Z can begin.
|
||||
Step V must be finished before step H can begin.
|
||||
Step R must be finished before step H can begin.
|
||||
Step U must be finished before step N can begin.
|
||||
Step O must be finished before step Z can begin.
|
||||
Step X must be finished before step S can begin.
|
||||
Step E must be finished before step G can begin.
|
||||
Step W must be finished before step U can begin.
|
||||
Step U must be finished before step G can begin.
|
||||
Step D must be finished before step Z can begin.
|
||||
Step E must be finished before step R can begin.
|
||||
Step L must be finished before step B can begin.
|
||||
Step B must be finished before step R can begin.
|
||||
Step G must be finished before step T can begin.
|
||||
Step F must be finished before step K can begin.
|
||||
Step R must be finished before step S can begin.
|
||||
Step J must be finished before step Z can begin.
|
||||
Step Q must be finished before step U can begin.
|
||||
Step X must be finished before step O can begin.
|
||||
Step F must be finished before step I can begin.
|
||||
Step W must be finished before step R can begin.
|
||||
Step W must be finished before step Y can begin.
|
||||
Step M must be finished before step Y can begin.
|
||||
Step S must be finished before step I can begin.
|
||||
Step F must be finished before step O can begin.
|
||||
Step C must be finished before step Y can begin.
|
||||
Step N must be finished before step G can begin.
|
||||
Step O must be finished before step S can begin.
|
||||
Step Q must be finished before step O can begin.
|
||||
Step K must be finished before step T can begin.
|
||||
Step X must be finished before step Z can begin.
|
||||
Step L must be finished before step N can begin.
|
||||
Step S must be finished before step P can begin.
|
Loading…
x
Reference in New Issue
Block a user