Solve 2023:05 "If You Give A Seed A Fertilizer"

Part 2 takes 66 minutes to run. There is some smart
things to realize here.
This commit is contained in:
Anders Englöf Ytterström 2023-12-05 23:10:51 +01:00 committed by Anders Englöf Ytterström
parent cbd4bf50e1
commit ad05c8fab4

View file

@ -0,0 +1,103 @@
import re
from itertools import repeat
from math import inf
from multiprocessing import Pool, freeze_support
from output import answer, puzzleinput
n = 5
title = "If You Give A Seed A Fertilizer"
@answer(1, "Nearest location for seed id list is {}")
def part_1(data):
seeds, *process = data.split("\n\n")
seeds = [f"{v} 1" for v in seeds.split()[1:]]
return _bruteforce(seeds, process, 1)
@answer(2, "Interpreting ranges of seeds, nearest location is {}")
def part_2(data):
seeds, *process = data.split("\n\n")
seeds = re.findall(r"\d+ \d+", seeds)
return _bruteforce(seeds, process, 8)
@puzzleinput(n)
def parse_input(data):
return data
def _bruteforce(seeds, process, p=1):
processes = [[tuple(map(int, line.split())) for line in step.splitlines()[1:]] for step in process]
sm = []
for start_r in seeds:
pool = Pool()
start, r = start_r.split()
d = int(r) // p
parts = [(d * n + int(start), d * n + int(start) + d) for n in range(p)]
sm += pool.starmap(_nearest, zip(parts, repeat(processes)))
return min(sm)
def _nearest(start_r, processes):
a, b = start_r
nearest = inf
for i in range(a, b):
v = i
for steps in processes:
nid = -1
for line in steps:
dest, src, r = line
if v >= src and v < src + r:
v = dest + v - src
break
nearest = min(nearest, v)
return nearest
if __name__ == "__main__":
# use dummy data
inp = """
seeds: 79 14 55 13
seed-to-soil map:
50 98 2
52 50 48
soil-to-fertilizer map:
0 15 37
37 52 2
39 0 15
fertilizer-to-water map:
49 53 8
0 11 42
42 0 7
57 7 4
water-to-light map:
88 18 7
18 25 70
light-to-temperature map:
45 77 23
81 45 19
68 64 13
temperature-to-humidity map:
0 69 1
1 0 69
humidity-to-location map:
60 56 37
56 93 4
""".strip()
# inp = parse_input()
a = part_1(inp)
b = part_2(inp)
# assert a == 278755257
# assert b == 26829166