diff --git a/2018/day07.py b/2018/day07.py new file mode 100644 index 0000000..1c32865 --- /dev/null +++ b/2018/day07.py @@ -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)}") \ No newline at end of file diff --git a/2018/input/day07.txt b/2018/input/day07.txt new file mode 100644 index 0000000..8ab8024 --- /dev/null +++ b/2018/input/day07.txt @@ -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.