This commit is contained in:
basicbonobo 2023-12-05 19:52:43 +01:00
parent 84d7ef5656
commit 4b0013ee1c
2 changed files with 42 additions and 5 deletions

43
five.py
View File

@ -4,7 +4,6 @@ from useful import *
seedstr, rest = headerfooter(open(0))
seeds = numbers(seedstr)
ic(seeds)
def getmap(l):
"""
@ -16,12 +15,11 @@ def getmap(l):
return source, (dest, list(trips))
guide = {k: v for (k, v) in (getmap(p) for p in pgphs(rest))} # ugh
ic(guide['water'])
def move(origin, kart):
for dst, src, size in kart:
if src <= origin < src + size:
return origin + dst - src # i bet part 2 will change this
return origin + dst - src
return origin
def ship(element, target, origin): # ship('seed', 'light', 42)
@ -30,4 +28,43 @@ def ship(element, target, origin): # ship('seed', 'light', 42)
dest, kart = guide[element]
return ship(dest, target, move(origin, kart))
def chop(origin, kart):
bego, leno = origin
endo = bego + leno
if not leno:
return []
if not kart:
return origin,
dst, src, size = kart[0]
"""
how generically can we do this?
well, when we chop the thing, there's at most going to be
- something < dst
- something inside dst (to be transformed)
- something >= dst+size
simply grab these three chunks, and recurse on the first and last.
(something already transformed obviously shouldn't be transformed back)
"""
before = (bego, min(endo, src)) if bego < src else (0, 0)
after = (max(bego, src+size), endo) if src + size < endo else (0, 0)
inside = (max(bego, src), min(endo, src+size)) if not endo <= src or bego >= src+size else (0, 0)
during = inside if inside[1] > inside[0] else (0, 0)
bl = before[0], before[1]-before[0]
dl = during[0]+dst-src, during[1]-during[0]
al = after[0], after[1]-after[0]
return (a for a in (*chop(bl, kart[1:]),
dl,
*chop(al, kart[1:])) if a[0] >= 0 and a[1] > 0)
def twoship(element, target, origin, indent=0): # ship('seed', 'light', (420, 69))
if len(sys.argv) > 1 and sys.argv[1] == '-v':
print(' ' * indent, element, origin)
if element == target:
return origin
dest, kart = guide[element]
bis = [twoship(dest, target, c, indent+1) for c in chop(origin, kart)]
return bis
print(min(ship('seed', 'location', s) for s in seeds))
print(min(beg for (beg, sz) in batched(
collapse([twoship('seed', 'location', p) for p in batched(seeds, 2)]), 2)))

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
from functools import cache, reduce
from itertools import permutations, product, combinations, pairwise, groupby, takewhile
from more_itertools import batched, sliding_window
from itertools import chain, permutations, product, combinations, pairwise, groupby, takewhile
from more_itertools import batched, collapse, sliding_window
from collections import defaultdict, deque
import re, sys
import math