2023-12-06 00:12:34 +00:00
|
|
|
import fileinput
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
|
def parse_map(input):
|
|
|
|
try:
|
|
|
|
while line := next(input).strip():
|
|
|
|
yield tuple(int(n) for n in line.strip().split())
|
|
|
|
next(input)
|
|
|
|
except StopIteration:
|
|
|
|
pass
|
|
|
|
|
|
|
|
yield (0, 0, sys.maxsize)
|
|
|
|
|
|
|
|
|
|
|
|
def transform_ranges(map, ranges):
|
|
|
|
for start, length in ranges:
|
|
|
|
# find the start of the range
|
|
|
|
(dst_start, src_start, len) = next((dst, src, len) for (dst, src, len) in map if src <= start < (src + len))
|
|
|
|
|
|
|
|
end = start + length
|
|
|
|
src_end = src_start + len
|
|
|
|
|
|
|
|
# yield the starting range
|
|
|
|
yield (dst_start + start - src_start, min(src_end, end) - start)
|
|
|
|
|
|
|
|
# if range is not complete, recurse into the rest
|
|
|
|
if end > src_end:
|
|
|
|
yield from transform_ranges(map, [(src_end, end - src_end)])
|
|
|
|
|
|
|
|
|
2023-12-06 00:36:05 +00:00
|
|
|
def do_the_thing(ranges):
|
|
|
|
soils = transform_ranges(seed_to_soil, ranges)
|
|
|
|
ferts = transform_ranges(soil_to_fert, soils)
|
|
|
|
waters = transform_ranges(fert_to_water, ferts)
|
|
|
|
lights = transform_ranges(water_to_light, waters)
|
|
|
|
temps = transform_ranges(light_to_temp, lights)
|
|
|
|
humids = transform_ranges(temp_to_humid, temps)
|
|
|
|
locs = transform_ranges(humid_to_loc, humids)
|
2023-12-06 00:12:34 +00:00
|
|
|
|
2023-12-06 00:36:05 +00:00
|
|
|
(loc, _) = min(locs)
|
|
|
|
return loc
|
2023-12-06 00:12:34 +00:00
|
|
|
|
|
|
|
|
2023-12-06 00:36:05 +00:00
|
|
|
input = fileinput.input()
|
2023-12-06 00:12:34 +00:00
|
|
|
|
2023-12-06 00:36:05 +00:00
|
|
|
seeds = [int(seed) for seed in next(input).split()[1:]]
|
|
|
|
next(input)
|
|
|
|
next(input)
|
2023-12-06 00:12:34 +00:00
|
|
|
|
2023-12-06 00:36:05 +00:00
|
|
|
seed_to_soil = list(parse_map(input))
|
|
|
|
soil_to_fert = list(parse_map(input))
|
|
|
|
fert_to_water = list(parse_map(input))
|
|
|
|
water_to_light = list(parse_map(input))
|
|
|
|
light_to_temp = list(parse_map(input))
|
|
|
|
temp_to_humid = list(parse_map(input))
|
|
|
|
humid_to_loc = list(parse_map(input))
|
2023-12-06 00:12:34 +00:00
|
|
|
|
2023-12-06 00:36:05 +00:00
|
|
|
part1 = do_the_thing((seed, 1) for seed in seeds)
|
|
|
|
part2 = do_the_thing(zip(*(iter(seeds),) * 2))
|
2023-12-06 00:12:34 +00:00
|
|
|
|
2023-12-06 00:36:05 +00:00
|
|
|
print(part1, part2)
|