day 10, part 1 ok, part 2 with help, but nice drawing
This commit is contained in:
		
							
								
								
									
										59
									
								
								d10/run.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								d10/run.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# parse
 | 
				
			||||||
 | 
					I = sys.stdin.read().splitlines()
 | 
				
			||||||
 | 
					G = [list(l) for l in I]
 | 
				
			||||||
 | 
					W = len(G[0])
 | 
				
			||||||
 | 
					H = len(G)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# look for S
 | 
				
			||||||
 | 
					S = None
 | 
				
			||||||
 | 
					for y in range(H):
 | 
				
			||||||
 | 
					    if (x := I[y].find("S")) > -1:
 | 
				
			||||||
 | 
					        S = (x,y)
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# encode moves
 | 
				
			||||||
 | 
					D = {
 | 
				
			||||||
 | 
					    'u': {'|': ( 0,-1,'u'), 'F': ( 1, 0,'r'), '7': (-1, 0,'l')},
 | 
				
			||||||
 | 
					    'r': {'-': ( 1, 0,'r'), 'J': ( 0,-1,'u'), '7': ( 0, 1,'d')},
 | 
				
			||||||
 | 
					    'd': {'|': ( 0, 1,'d'), 'L': ( 1, 0,'r'), 'J': (-1, 0,'l')},
 | 
				
			||||||
 | 
					    'l': {'-': (-1, 0,'l'), 'L': ( 0,-1,'u'), 'F': ( 0, 1,'d')},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# part 1
 | 
				
			||||||
 | 
					poly = [S]  # vertices of the polygone
 | 
				
			||||||
 | 
					x0, y0 = S
 | 
				
			||||||
 | 
					P = (x0+1, y0, 'r')  # start at S and go right
 | 
				
			||||||
 | 
					for _ in range(100_000):
 | 
				
			||||||
 | 
					    x, y, d = P
 | 
				
			||||||
 | 
					    poly.append((x,y))
 | 
				
			||||||
 | 
					    z = G[y][x]
 | 
				
			||||||
 | 
					    if z == 'S':
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					    dx,dy,nd = D[d].get(z)
 | 
				
			||||||
 | 
					    P = (x+dx,y+dy,nd)
 | 
				
			||||||
 | 
					print(len(poly)//2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# part 2
 | 
				
			||||||
 | 
					from matplotlib.path import Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pg = Path(poly)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					J = [['.']*W for _ in range(H)]
 | 
				
			||||||
 | 
					R = 0
 | 
				
			||||||
 | 
					for y in range(W):
 | 
				
			||||||
 | 
					    for x in range(H):
 | 
				
			||||||
 | 
					        if (x,y) in poly:
 | 
				
			||||||
 | 
					            J[y][x] = G[y][x]
 | 
				
			||||||
 | 
					        elif pg.contains_point((x,y)):
 | 
				
			||||||
 | 
					            R += 1
 | 
				
			||||||
 | 
					            J[y][x] = "O"
 | 
				
			||||||
 | 
					print(R)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# plot
 | 
				
			||||||
 | 
					J[y0][x0] = "S"
 | 
				
			||||||
 | 
					T = str.maketrans("|-LJ7F", "│─└┘┐┌")
 | 
				
			||||||
 | 
					with open("grid.txt","wt") as f:
 | 
				
			||||||
 | 
					    for row in J:
 | 
				
			||||||
 | 
					        print("".join(row).translate(T), file=f)
 | 
				
			||||||
		Reference in New Issue
	
	Block a user