#!/usr/bin/env python3.11 from typing import List import concurrent.futures from data import Node, parse #It is inefficient, more time in sys than in User... def movement(current_node: Node, direction: str, node_list: List[Node]) -> Node: if direction == 'L': return current_node.move_left(node_list) else: return current_node.move_right(node_list) def count_steps_XXA_to_XXZ(directions:str, node_list: List[Node]) -> int: current_nodes = list(filter(lambda node: node.is_A_node(), node_list)) count = 0 while not all(map(lambda n: n.is_Z_node(), current_nodes)): with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor: futures = [] direction = directions[count % len(directions)] futures = [executor.submit(movement, node, direction, node_list) for node in current_nodes] current_nodes = [exec.result() for exec in concurrent.futures.as_completed(futures)] count += 1 return count if __name__ == '__main__': directions, node_list = parse('input.txt') print(count_steps_XXA_to_XXZ(directions, node_list))