Advertisement
Guest User

Untitled

a guest
Dec 16th, 2022
682
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.67 KB | None | 0 0
  1. from typing import Iterator
  2.  
  3. from aoclib import show_answers, get_puzzle_input
  4. import numpy as np
  5.  
  6. def solutions() -> Iterator[int]:
  7.     data = [[[d.strip(", y") for d in info.split("=")[1:]] for info in line.split(":")]\
  8.             for line in get_puzzle_input(day = 15)]
  9.     data = np.array(data,dtype=int)
  10.     #data shape: (input row,[sensor (s),beacon (b)],[x,y])
  11.    
  12.     roi = 2_000_000 #row of interest
  13.     s_b_dist = np.sum(np.abs(np.diff(data,axis=1)),axis=(1,2))
  14.     s_roi_dist = np.abs(data[:,0,1] - roi)
  15.     bx_sx_dists_on_roi = s_b_dist - s_roi_dist
  16.     bx,by = data[:,1,:].T
  17.     near_roi = bx_sx_dists_on_roi>=0
  18.     bx_sx_dists_on_roi = bx_sx_dists_on_roi[near_roi]
  19.     sx = data[near_roi,0,0]
  20.     ranges = np.concatenate([np.arange(x-dist,x+dist+1) for x,dist in zip(sx,bx_sx_dists_on_roi)])
  21.     yield np.setdiff1d(ranges,bx[by==roi]).size
  22.  
  23.     limit = 4_000_000
  24.     first_diag = -1j-1
  25.     rotations = 1j**np.arange(4)[None,None,:]
  26.     sensors = data[:,0,0]+1j*data[:,0,1]
  27.     perims = [(sensor + (dist+1+np.arange(dist+1)[:,None]*first_diag)*rotations).flat \
  28.               for sensor,dist in zip(sensors,s_b_dist)]
  29.  
  30.     perims = np.concatenate(perims)
  31.     inside_square = (np.abs(np.real(perims)-limit//2)<=limit//2) \
  32.                   * (np.abs(np.imag(perims)-limit//2)<=limit//2)
  33.    
  34.     perims,counts = np.unique(perims[inside_square],return_counts=True)
  35.     perims = perims[counts>1]
  36.  
  37.     for sensor, dist in zip(sensors,s_b_dist):
  38.         diff = perims - sensor
  39.         pdist = np.abs(diff.real) + np.abs(diff.imag)
  40.         perims = perims[pdist>dist]
  41.     zb, = perims
  42.     yield int(zb.real*4_000_000 + zb.imag)
  43.        
  44. show_answers(solutions())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement