diff --git a/Day7/Day7.py b/Day7/Day7.py deleted file mode 100644 index 5448acb..0000000 --- a/Day7/Day7.py +++ /dev/null @@ -1,27 +0,0 @@ -import fileinput -from collections import defaultdict - -def work_seconds(node): - return ord(node) - ord('A') + 60 - -graph = defaultdict(set) -for line in fileinput.input(): - a = line[5] - b = line[36] - - graph[b].add(a) - graph[a] - -order = [] -to_consider = sorted(graph.keys()) -while to_consider: - for i, node in enumerate(to_consider): - parents = graph[node] - if any(parent in to_consider for parent in parents): - continue - - order.append(node) - del to_consider[i] - break - -print("".join(order)) diff --git a/Day7/Day7A.py b/Day7/Day7A.py new file mode 100644 index 0000000..ed6e718 --- /dev/null +++ b/Day7/Day7A.py @@ -0,0 +1,32 @@ +import fileinput +from collections import defaultdict + +def build_graph(): + graph = defaultdict(list) + for line in fileinput.input(): + a, b = line[5], line[36] + graph[b].append(a) + graph[a] + + return graph + + +def main(): + graph = build_graph() + + order = [] + to_consider = sorted(graph.keys()) + while to_consider: + for i, node in enumerate(to_consider): + parents = graph[node] + if any(parent in to_consider for parent in parents): + continue + + order.append(node) + del to_consider[i] + break + + print("".join(order)) + +if __name__ == "__main__": + main() diff --git a/Day7/Day7B.py b/Day7/Day7B.py new file mode 100644 index 0000000..d7d507e --- /dev/null +++ b/Day7/Day7B.py @@ -0,0 +1,82 @@ +import fileinput +from collections import defaultdict +from Day7A import build_graph + +WORKERS = 5 +BASE_TIME = 60 + +graph = build_graph() + +order = [] +to_consider = sorted(graph.keys()) + +worker_nodes = [None] * WORKERS +worker_times = [None] * WORKERS +active_workers = 0 +time = 0 + +def work_seconds(node): + return ord(node) - ord('A') + BASE_TIME + +def start_work(worker, node): + global active_workers + + worker_nodes[worker] = node + worker_times[worker] = work_seconds(node) + active_workers += 1 + +def update_workers(): + global time + global active_workers + + for i in range(WORKERS): + if worker_nodes[i] is None: + continue + + if worker_times[i]: + worker_times[i] -= 1 + else: + active_workers -= 1 + worker_nodes[i] = None + + time += 1 + +def print_status(): + worker_status = "".join(node if node else "." for node in worker_nodes) + todo = "".join(to_consider) + print(f"{time:>4d} {worker_status:<7} [{todo}]") + +def main(): + global active_workers + + print("Time Workers To Do") + while to_consider or active_workers: + last_count = -1 + while last_count != active_workers: + last_count = active_workers + + for i, node in enumerate(to_consider): + parents = graph[node] + if node in worker_nodes: + continue + + if any(parent in worker_nodes or parent in to_consider + for parent in parents): + continue + + for w_id in range(WORKERS): + if worker_nodes[w_id] is None: + start_work(w_id, node) + break + else: + break + + del to_consider[i] + continue + + print_status() + update_workers() + + print_status() + +main()