add solution to day5
This commit is contained in:
72
5/fertilizer.py
Normal file
72
5/fertilizer.py
Normal file
@@ -0,0 +1,72 @@
|
||||
from aocd.models import Puzzle
|
||||
from aocd import submit
|
||||
from functools import reduce
|
||||
from operator import itemgetter
|
||||
|
||||
import re
|
||||
|
||||
|
||||
def parse_almanac(data):
|
||||
NUMBER_RE = re.compile(r"\d+")
|
||||
stanzas = data.split("\n\n")
|
||||
return [int(m.group(0)) for m in NUMBER_RE.finditer(stanzas[0])], [
|
||||
sorted(
|
||||
(
|
||||
(nums[1], nums[1] + nums[2], nums[0] - nums[1])
|
||||
for line in stanza.splitlines()
|
||||
if len(nums := [int(m.group(0)) for m in NUMBER_RE.finditer(line)]) == 3
|
||||
),
|
||||
key=itemgetter(0),
|
||||
)
|
||||
for stanza in stanzas[1:]
|
||||
]
|
||||
|
||||
|
||||
def remap_almanac(ranges, mappings):
|
||||
for start, end in ranges:
|
||||
for start2, end2, offset in mappings:
|
||||
if start2 >= end or start >= end2:
|
||||
continue
|
||||
if start < start2:
|
||||
yield start, start2
|
||||
start = start2
|
||||
end2 = min(end, end2)
|
||||
yield start + offset, end2 + offset
|
||||
start = end2
|
||||
if start < end:
|
||||
yield start, end
|
||||
|
||||
|
||||
def part_a(data):
|
||||
seeds, mappings = parse_almanac(data)
|
||||
return min(
|
||||
map(itemgetter(0), reduce(remap_almanac, mappings, ((x, x + 1) for x in seeds)))
|
||||
)
|
||||
|
||||
|
||||
def part_b(data):
|
||||
seeds, mappings = parse_almanac(data)
|
||||
return min(
|
||||
map(
|
||||
itemgetter(0),
|
||||
reduce(
|
||||
remap_almanac,
|
||||
mappings,
|
||||
((x, x + y) for x, y in zip(*[iter(seeds)] * 2)),
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# get puzzle and parse data
|
||||
puzzle = Puzzle(year=2023, day=5)
|
||||
|
||||
answer_a = part_a(puzzle.input_data)
|
||||
print(f"{answer_a}")
|
||||
submit(answer_a, part="a", day=5, year=2023)
|
||||
|
||||
# part b:
|
||||
answer_b = part_b(puzzle.input_data)
|
||||
print(f"{answer_b}")
|
||||
submit(answer_b, part="b", day=5, year=2023)
|
||||
Reference in New Issue
Block a user