Added 2018 day 7

This commit is contained in:
Akumatic 2019-11-15 14:32:35 +01:00
parent 0723fd7dd2
commit 506b86a7a8
2 changed files with 209 additions and 0 deletions

108
2018/day07.py Normal file
View 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
View 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.