#!/usr/bin/env python3 # -*- coding: utf-8 -*- from multiprocessing import Pool from time import time start = time() seeds = [] # 0 seed_to_soil = [] # 1 soil_to_fertilizer = [] # 2 fertilizer_to_water = [] # 3 water_to_light = [] # 4 light_to_temperature = [] # 5 temperature_to_humidity = [] # 6 humidity_to_location = [] # 7 list_number = 0 def find_dest(num, map_list): for m in map_list: if m[1] <= num < m[1] + m[2]: return num - m[1] + m[0] return num # parse input input_file = open("input", "r") for line in input_file: line = line.strip() if line == "": continue if line.startswith('seeds: '): seeds = [int(x) for x in line.replace('seeds: ', '').split()] if line == "seed-to-soil map:": list_number = 1 continue if line == "soil-to-fertilizer map:": list_number = 2 continue if line == "fertilizer-to-water map:": list_number = 3 continue if line == "water-to-light map:": list_number = 4 continue if line == "light-to-temperature map:": list_number = 5 continue if line == "temperature-to-humidity map:": list_number = 6 continue if line == "humidity-to-location map:": list_number = 7 continue if list_number == 1: seed_to_soil.append([int(x) for x in line.split()]) elif list_number == 2: soil_to_fertilizer.append([int(x) for x in line.split()]) elif list_number == 3: fertilizer_to_water.append([int(x) for x in line.split()]) elif list_number == 4: water_to_light.append([int(x) for x in line.split()]) elif list_number == 5: light_to_temperature.append([int(x) for x in line.split()]) elif list_number == 6: temperature_to_humidity.append([int(x) for x in line.split()]) elif list_number == 7: humidity_to_location.append([int(x) for x in line.split()]) input_file.close() def find_min(seed, ra): min_location = - 1 print(f"gestartet: Seed: {seed} Range: {ra}") for s in range(seed, seed + ra): soil = find_dest(s, seed_to_soil) fertilizer = find_dest(soil, soil_to_fertilizer) water = find_dest(fertilizer, fertilizer_to_water) light = find_dest(water, water_to_light) temperature = find_dest(light, light_to_temperature) humidity = find_dest(temperature, temperature_to_humidity) location = find_dest(humidity, humidity_to_location) if min_location == -1: min_location = location elif location < min_location: min_location = location print(f"beendet.. Seed: {seed} Range: {ra} MinLocation: {min_location}") return min_location if __name__ == '__main__': num_processes = 10 input_data = [] for i in range(0, len(seeds), 2): input_data.append((seeds[i], seeds[i+1])) # input_data manuell erstellt: # input_data = [(seeds[0], seeds[1]), (seeds[2], seeds[3]), (seeds[4], seeds[5]), (seeds[6], seeds[7]), # (seeds[8], seeds[9]), (seeds[10], seeds[11]), (seeds[12], seeds[13]), (seeds[14], seeds[15]), # (seeds[16], seeds[17]), (seeds[18], seeds[19])] with Pool(processes=num_processes) as pool: results = pool.starmap(find_min, input_data) print(results) print(f"kleinste Location: {min(results)}") print(f"Script beendet! Benötigte Zeit in Sekunden: {int(time()-start)}")