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