Advertisement
Guest User

adventofcode202318

a guest
Dec 18th, 2023
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.85 KB | None | 0 0
  1. from collections import defaultdict
  2.  
  3. dx = [1, 0, -1, 0]
  4. dy = [0, 1, 0, -1]
  5.  
  6. segments = defaultdict(list)
  7.  
  8. i, j = 0, 0
  9. for dir, s in data:
  10.   if dir == 1:
  11.     segments[j].append([i, i+s])
  12.   if dir == 3:
  13.     segments[j].append([i-s, i])
  14.   i, j = i+s*dy[dir], j+s*dx[dir]
  15.  
  16. in_segments = []
  17. ans = 0
  18. prev_x = 0
  19. for x in sorted(segments):
  20.   # add in areas since last change
  21.   ans += sum((b-a+1)*(x-prev_x) for a,b in in_segments)
  22.   prev_x = x
  23.  
  24.   for new_seg in sorted(segments[x]):
  25.     # find intersections with existing in_segments
  26.     delete = set()
  27.     for i, in_seg in enumerate(in_segments):
  28.       # if intersect
  29.       if max(new_seg[0], in_seg[0]) < min(new_seg[1], in_seg[1]):
  30.         mina, maxa = sorted((new_seg[0], in_seg[0]))
  31.         minb, maxb = sorted((new_seg[1], in_seg[1]))
  32.  
  33.         if mina == maxa and minb == maxb:
  34.           delete.add(i)
  35.           # removing [mina, maxa]
  36.           ans += (maxb - mina+1)
  37.           break
  38.         elif minb == maxb:
  39.           in_seg[:] = [mina, maxa]
  40.           # removing [maxa+1, maxb]
  41.           ans += (maxb - (maxa+1)+1)
  42.           break
  43.         elif mina == maxa:
  44.           in_seg[:] = [minb, maxb]
  45.           # removing [mina, minb-1]
  46.           ans += (minb-1 - (mina)+1)
  47.           break
  48.         else:
  49.           in_seg[:] = [mina, maxa]
  50.           new_seg = [minb, maxb]
  51.           # removing [maxa+1, minb-1]
  52.           ans += (minb - maxa - 1)
  53.     else:
  54.       # hack - could do this whole section inline above without sorting
  55.       in_segments.append(new_seg[:])
  56.       in_segments.sort()
  57.  
  58.       i = 0
  59.       while i < len(in_segments)-1:
  60.         if in_segments[i][-1] == in_segments[i+1][0]:
  61.           in_segments[i][-1] = in_segments[i+1][1]
  62.           del in_segments[i+1]
  63.         else:
  64.           i += 1
  65.  
  66.     if delete:
  67.       for i in delete:
  68.         del in_segments[i]
  69.  
  70. print(ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement