My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add solution for 2018/07

+209
+106
2018/day07.py
··· 1 + import fileinput 2 + from copy import deepcopy 3 + from collections import defaultdict 4 + 5 + 6 + def toposort(data): 7 + """ 8 + Topological sort implementation via: 9 + https://bitbucket.org/ericvsmith/toposort/src/e63ddf93ccb68a7e33ba97680ecdb72ea9f96669/toposort.py 10 + """ 11 + from functools import reduce as _reduce 12 + 13 + # Special case empty input. 14 + if len(data) == 0: 15 + return 16 + 17 + # Copy the input so as to leave it unmodified. 18 + data = data.copy() 19 + 20 + # Ignore self dependencies. 21 + for k, v in data.items(): 22 + v.discard(k) 23 + # Find all items that don't depend on anything. 24 + extra_items_in_deps = _reduce(set.union, data.values()) - set(data.keys()) 25 + # Add empty dependences where needed. 26 + data.update({item:set() for item in extra_items_in_deps}) 27 + while True: 28 + ordered = set(item for item, dep in data.items() if len(dep) == 0) 29 + if not ordered: 30 + break 31 + yield ordered 32 + data = {item: (dep - ordered) for item, dep in data.items() if item not in ordered} 33 + if len(data) != 0: 34 + raise Exception() 35 + 36 + 37 + def purge_val(graph, val): 38 + for k in graph: 39 + graph[k].discard(val) 40 + 41 + try: 42 + del graph[val] 43 + except Exception: 44 + pass 45 + 46 + 47 + # Read problem input 48 + GRAPH = defaultdict(set) 49 + 50 + for line in fileinput.input(): 51 + words = line.split() 52 + a, b = words[1], words[7] 53 + GRAPH[b].add(a) 54 + 55 + 56 + # Solve Part 1 57 + graph = deepcopy(GRAPH) 58 + order = '' 59 + 60 + while graph: 61 + candidates = sorted(''.join(next(toposort(graph)))) 62 + a = candidates[0] 63 + order += a 64 + purge_val(graph, a) 65 + 66 + print "Instruction order:", order 67 + 68 + 69 + # Solve Part 2 70 + graph = deepcopy(GRAPH) 71 + workers = [('.', 0)] * 5 72 + queued = set() 73 + 74 + time = 0 75 + done = '' 76 + 77 + while True: 78 + try: 79 + okay = set(next(toposort(graph))) 80 + except StopIteration: 81 + break 82 + 83 + candidates = list(sorted(okay - queued, reverse=True)) 84 + 85 + for i, (step, left) in enumerate(workers): 86 + if step != '.' and left == 0: 87 + done += step 88 + purge_val(graph, step) 89 + workers[i] = ('.', 0) 90 + break 91 + else: 92 + for i, (step, left) in enumerate(workers): 93 + if step == '.' and candidates: 94 + a = candidates.pop() 95 + queued.add(a) 96 + workers[i] = (a, 60 + (ord(a) - ord('A'))) 97 + elif step != '.': 98 + a, b = workers[i] 99 + workers[i] = (a, b - 1) 100 + 101 + # print "t={}\tworkers={}\tdone={}".format(time, ' '.join(w[0] for w in workers), done) 102 + time += 1 103 + 104 + continue 105 + 106 + print "Time to complete all steps:", time
+101
2018/inputs/07.txt
··· 1 + Step G must be finished before step S can begin. 2 + Step T must be finished before step Q can begin. 3 + Step A must be finished before step B can begin. 4 + Step H must be finished before step X can begin. 5 + Step V must be finished before step O can begin. 6 + Step Z must be finished before step P can begin. 7 + Step R must be finished before step J can begin. 8 + Step L must be finished before step Y can begin. 9 + Step Y must be finished before step E can begin. 10 + Step W must be finished before step X can begin. 11 + Step X must be finished before step B can begin. 12 + Step K must be finished before step E can begin. 13 + Step Q must be finished before step P can begin. 14 + Step U must be finished before step B can begin. 15 + Step M must be finished before step O can begin. 16 + Step P must be finished before step N can begin. 17 + Step I must be finished before step J can begin. 18 + Step B must be finished before step C can begin. 19 + Step C must be finished before step O can begin. 20 + Step J must be finished before step F can begin. 21 + Step F must be finished before step O can begin. 22 + Step E must be finished before step D can begin. 23 + Step D must be finished before step N can begin. 24 + Step N must be finished before step S can begin. 25 + Step S must be finished before step O can begin. 26 + Step W must be finished before step O can begin. 27 + Step L must be finished before step P can begin. 28 + Step N must be finished before step O can begin. 29 + Step T must be finished before step D can begin. 30 + Step G must be finished before step I can begin. 31 + Step V must be finished before step X can begin. 32 + Step B must be finished before step N can begin. 33 + Step R must be finished before step N can begin. 34 + Step H must be finished before step J can begin. 35 + Step B must be finished before step S can begin. 36 + Step P must be finished before step I can begin. 37 + Step A must be finished before step J can begin. 38 + Step A must be finished before step U can begin. 39 + Step B must be finished before step D can begin. 40 + Step T must be finished before step A can begin. 41 + Step U must be finished before step D can begin. 42 + Step T must be finished before step L can begin. 43 + Step I must be finished before step E can begin. 44 + Step R must be finished before step U can begin. 45 + Step H must be finished before step S can begin. 46 + Step P must be finished before step F can begin. 47 + Step Q must be finished before step C can begin. 48 + Step A must be finished before step P can begin. 49 + Step X must be finished before step E can begin. 50 + Step Q must be finished before step N can begin. 51 + Step E must be finished before step N can begin. 52 + Step Q must be finished before step O can begin. 53 + Step J must be finished before step S can begin. 54 + Step X must be finished before step P can begin. 55 + Step K must be finished before step U can begin. 56 + Step F must be finished before step E can begin. 57 + Step C must be finished before step E can begin. 58 + Step H must be finished before step K can begin. 59 + Step W must be finished before step B can begin. 60 + Step G must be finished before step O can begin. 61 + Step F must be finished before step N can begin. 62 + Step I must be finished before step D can begin. 63 + Step G must be finished before step V can begin. 64 + Step E must be finished before step S can begin. 65 + Step Y must be finished before step P can begin. 66 + Step G must be finished before step E can begin. 67 + Step P must be finished before step J can begin. 68 + Step U must be finished before step N can begin. 69 + Step U must be finished before step F can begin. 70 + Step X must be finished before step U can begin. 71 + Step X must be finished before step C can begin. 72 + Step R must be finished before step Q can begin. 73 + Step Q must be finished before step E can begin. 74 + Step Z must be finished before step E can begin. 75 + Step X must be finished before step F can begin. 76 + Step J must be finished before step D can begin. 77 + Step X must be finished before step M can begin. 78 + Step Y must be finished before step D can begin. 79 + Step K must be finished before step J can begin. 80 + Step Z must be finished before step J can begin. 81 + Step M must be finished before step P can begin. 82 + Step T must be finished before step M can begin. 83 + Step F must be finished before step S can begin. 84 + Step P must be finished before step S can begin. 85 + Step X must be finished before step I can begin. 86 + Step U must be finished before step J can begin. 87 + Step M must be finished before step B can begin. 88 + Step Q must be finished before step D can begin. 89 + Step Z must be finished before step I can begin. 90 + Step D must be finished before step S can begin. 91 + Step J must be finished before step N can begin. 92 + Step D must be finished before step O can begin. 93 + Step T must be finished before step H can begin. 94 + Step P must be finished before step D can begin. 95 + Step M must be finished before step F can begin. 96 + Step Y must be finished before step S can begin. 97 + Step H must be finished before step I can begin. 98 + Step Y must be finished before step W can begin. 99 + Step X must be finished before step J can begin. 100 + Step L must be finished before step W can begin. 101 + Step G must be finished before step N can begin.
+2
2018/outputs/07.txt
··· 1 + GRTAHKLQVYWXMUBCZPIJFEDNSO 2 + 1115