#!/usr/bin/env python3 import sys, re def key_dest(key, mp): for src, (length,dest) in mp.items(): if key in range(src, src+length): return dest+(key-src) return key def rang_dest(rang, mp): sols = [] for (key_s, key_l) in rang: for src, (length,dest) in dict(sorted(mp.items())).items(): if key_s in range(src,src+length): if key_s + key_l -1 in range(src,src+length): sols += [(dest-src+key_s,key_l)] key_l = 0 break else: sols += [(dest-src+key_s, src+length-key_s)] key_l -= (length + src - key_s) key_s = src+length if key_l > 0: sols += [(key_s, key_l)] return list(set(sols)) if __name__ == '__main__': lines = [line.strip('\n') for line in open(sys.argv[1])] seeds = [int(n) for n in re.findall(r'(\d+)',lines[0])] maps = { 'seed-to-soil': {}, 'soil-to-fertilizer': {}, 'fertilizer-to-water': {}, 'water-to-light': {}, 'light-to-temperature': {}, 'temperature-to-humidity': {}, 'humidity-to-location': {}} key = '' for line in lines[2:]: if re.match(r'(.*) map:', line): key = re.search(r'(?P.*) map:', line).group('name') elif re.match(r'\d+', line): dest, src, length = [int(i) for i in re.findall(r'\d+',line)] maps[key][src] = (length,dest) res1 = 10000000000000000 for seed in seeds: soil = key_dest(seed, maps['seed-to-soil']) fert = key_dest(soil, maps['soil-to-fertilizer']) water = key_dest(fert, maps['fertilizer-to-water']) light = key_dest(water, maps['water-to-light']) temp = key_dest(light, maps['light-to-temperature']) hum = key_dest(temp, maps['temperature-to-humidity']) loc = key_dest(hum, maps['humidity-to-location']) if loc < res1: res1 = loc res2 = 10000000000000000 for i in range(int(len(seeds)/2)): src, length = seeds[i*2], seeds[i*2+1] seed = [(src,length)] soil = rang_dest(seed, maps['seed-to-soil']) fert = rang_dest(soil, maps['soil-to-fertilizer']) water = rang_dest(fert, maps['fertilizer-to-water']) light = rang_dest(water, maps['water-to-light']) temp = rang_dest(light, maps['light-to-temperature']) hum = rang_dest(temp, maps['temperature-to-humidity']) loc = rang_dest(hum, maps['humidity-to-location']) for i,_ in loc: if i < res2: res2 = i # challenge 1 res1 = str(res1) print(f"challenge 1:\n{res1}\n") # challenge 2 res2 = str(res2) print(f"challenge 2:\n{res2}\n")