day 5 cleanup

main
magical 2023-12-05 06:19:05 +00:00
parent 94277435d2
commit 172a8a9d87
1 changed files with 26 additions and 21 deletions

View File

@ -9,32 +9,31 @@ def read_map(input):
def overlap(a,b, x,y): def overlap(a,b, x,y):
""" if two ranges a..a+b and x..x+y overlap, returns the overlapping range""" """ if two ranges a..b and x..y overlap, returns the overlapping range"""
if b <= x or y <= a: if b <= x or y <= a:
return (0,0) # no overlap return (0,0) # no overlap
return max(a,x), min(b,y) return max(a,x), min(b,y)
def lookup(map, m,n): def lookup(map, m,n):
r = [] r = [] # (start,count)
used = [] used = [] # (start,end)
for dst, src, count in map: for dst, src, count in map:
a,b = overlap(m,m+n, src,src+count) a,b = overlap(m,m+n, src,src+count)
if a != b: if a != b:
assert a < b assert a < b
used.append((a,b)) used.append((a,b))
r.append((a-src+dst,b-a)) r.append((a-src+dst,b-a))
if not used: # unused values translate to themselves
r.append((m,n)) used.sort()
else: end = m+n
used.sort() for a,b in used:
end = m+n assert m <= a
for a,b in used: if m < a:
assert m <= a r.append((m, a-m))
if m < a: m = b
r.append((m, a-m)) if m < end:
m = b r.append((m,end-m))
if m < end: #r.sort()
r.append((m,end-m))
return r return r
def nums(s): def nums(s):
@ -60,17 +59,22 @@ def read_puzzle(input):
print(seeds) print(seeds)
print(maps) print(maps)
locs = [] return seeds,maps
def solve(data):
seeds, maps = data
for i in range(0, len(seeds), 2): for i in range(0, len(seeds), 2):
m,n = seeds[i:i+2] m,n = seeds[i:i+2]
print(n, lookup(maps[('seed','soil')], m,n), seed2loc(maps, m,n)) print(n, lookup(maps[('seed','soil')], m,n))
locs.extend(seed2loc(maps, m,n))
ranges = [(seeds[i],seeds[i+1]) for i in range(0,len(seeds),2)]
locs = seed2loc(maps, ranges)
print(min(locs)) print(min(locs))
def seed2loc(maps, m,n): def seed2loc(maps, r):
r = [(m,n)]
for a,b in [ for a,b in [
('seed', 'soil'), ('seed', 'soil'),
('soil', 'fertilizer'), ('soil', 'fertilizer'),
@ -89,4 +93,5 @@ def seed2loc(maps, m,n):
return r return r
import sys import sys
read_puzzle(sys.stdin) p = read_puzzle(sys.stdin)
solve(p)