Advertisement
hhoppe

Advent of code 2023 day 5 old

Dec 5th, 2023 (edited)
732
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.96 KB | None | 0 0
  1. def day5(s, *, part2=False):
  2.   sections = s.split('\n\n')
  3.   (line,) = sections[0].splitlines()
  4.   values = map(int, line.split(': ')[1].split())
  5.   if part2:
  6.     intervals = [(start, start + n) for start, n in more_itertools.batched(values, 2)]
  7.   else:
  8.     intervals = [(start, start + 1) for start in values]
  9.  
  10.   def remap(start, stop, lines):
  11.     if not lines:
  12.       yield start, stop
  13.     else:
  14.       dst, src, num = map(int, lines[0].split())
  15.       i0, i1 = max(src, start), min(src + num, stop)
  16.       if i0 < i1:
  17.         yield dst + (i0 - src), dst + (i1 - src)
  18.       if i0 > start:
  19.         yield from remap(start, min(i0, stop), lines[1:])
  20.       if i1 < stop:
  21.         yield from remap(max(i1, start), stop, lines[1:])
  22.  
  23.   for section in sections[1:]:
  24.     lines = section.splitlines()[1:]
  25.     chain = itertools.chain.from_iterable
  26.     intervals = list(chain(remap(*interval, lines) for interval in intervals))
  27.  
  28.   return min(start for start, _ in intervals)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement