2023/day8/part2_parallel.py

29 lines
1.1 KiB
Python
Executable File

#!/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))