day 15 part 2 alternate solution
This commit is contained in:
		
							parent
							
								
									2b0ef33a08
								
							
						
					
					
						commit
						7b40516b66
					
				
							
								
								
									
										35
									
								
								day15/clip.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								day15/clip.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| import pyclipper # https://pypi.org/project/pyclipper/ | ||||
| 
 | ||||
| data = [] | ||||
| for line in open("input"): | ||||
|     words = line.replace(":", "").replace(",","").split() | ||||
|     coords = [int(w[w.index('=')+1:]) for w in words if '=' in w] | ||||
|     data.append(coords) | ||||
| 
 | ||||
| 
 | ||||
| pc = pyclipper.Pyclipper() | ||||
| for sx,sy,bx,by in data: | ||||
|     dx = abs(sx-bx) | ||||
|     dy = abs(sy-by) | ||||
|     d = dx+dy | ||||
|     pc.AddPath([(sx+d,sy),(sx,sy+d),(sx-d,sy),(sx,sy-d)], pyclipper.PT_CLIP, closed=True) | ||||
| 
 | ||||
| M = 4000000 | ||||
| pc.AddPath([(0,0),(M,0),(M,M),(0,M)], pyclipper.PT_SUBJECT, closed=True) | ||||
| 
 | ||||
| solution = pc.Execute(pyclipper.CT_DIFFERENCE, pyclipper.PFT_NONZERO, pyclipper.PFT_NONZERO) | ||||
| 
 | ||||
| # should return a single small polygon shaped like a diamond | ||||
| # the answer we want is the point at the center of the diamond | ||||
| 
 | ||||
| assert len(solution) == 1 | ||||
| assert pyclipper.Area(solution[0]) < 4 | ||||
| 
 | ||||
| def avg(ns): | ||||
|     return sum(ns)/len(ns) | ||||
| 
 | ||||
| for p in solution: | ||||
|     x = avg([x for x,y in p]) | ||||
|     y = avg([y for x,y in p]) | ||||
|     print(x,y) | ||||
|     print("frequency =",M*x + y) | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user