#!/usr/bin/env python3.11 # Is killed on WSL2 after vmmem increase to 16GB from day5.common import extract import concurrent.futures def seed_to_location(seed, maps): #print(seed) soil_maps = list(filter(lambda soil_map: soil_map.is_mapped(seed), maps["seed-to-soil"])) soil = seed if soil_maps == [] else soil_maps[0].mapped_value(seed) fertilizer_maps = list(filter(lambda fertilizer_map: fertilizer_map.is_mapped(soil), maps["soil-to-fertilizer"])) #print(fertilizer_maps) fertilizer = soil if fertilizer_maps == [] else fertilizer_maps[0].mapped_value(soil) water_maps = list(filter(lambda water_map: water_map.is_mapped(fertilizer), maps["fertilizer-to-water"])) water = fertilizer if water_maps == [] else water_maps[0].mapped_value(fertilizer) light_maps = list(filter(lambda light_map: light_map.is_mapped(water), maps["water-to-light"])) light = water if light_maps == [] else light_maps[0].mapped_value(water) temperature_maps = list(filter(lambda temperature_map: temperature_map.is_mapped(light), maps["light-to-temperature"])) temperature = light if temperature_maps == [] else temperature_maps[0].mapped_value(light) humidity_maps = list(filter(lambda humidity_map: humidity_map.is_mapped(temperature), maps["temperature-to-humidity"])) humidity = temperature if humidity_maps == [] else humidity_maps[0].mapped_value(temperature) location_maps = list(filter(lambda location_map: location_map.is_mapped(humidity), maps["humidity-to-location"])) location = humidity if location_maps == [] else location_maps[0].mapped_value(humidity) return location def parallel_loop(seeds, maps, index): lowest_location = None for seed_idx in range(seeds[index + 1]): seed = seeds[index] + seed_idx location = seed_to_location(seed, maps) if lowest_location is not None: lowest_location = min(lowest_location, location) else: lowest_location = location return lowest_location seeds, maps = extract("example_input.txt") print(seeds) minimums = [] with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: for idx in range(0, len(seeds), 2): minimum = executor.submit(parallel_loop, seeds, maps, idx) minimums.append(minimum) minimums = map(lambda x: x.result(), minimums) print(min(minimums))