import sys import os from pprint import pprint import time from shapely.geometry import Point from shapely.geometry.polygon import Polygon #colors from termcolor import colored grid = [] cur = [] log = True def p(x,steps,inside,*cur): global log if log: for idx,i in enumerate(x): for jdx,j in enumerate(i): if len(cur) < 0: if cur[1] == idx and cur[0] == jdx: print(colored(j,'blue'),end='') elif j == 'S': print(colored(j,'red'),end='') elif (idx,jdx) in steps: print(colored(j,'green'),end='') elif (idx,jdx) in inside: print(colored(j,'yellow'),end='') else: print(j,end='') print() def start_coords(grid): for ydx,y in enumerate(grid): for xdx,x in enumerate(y): if x == 'S': return (xdx,ydx) with open(sys.argv[1]) as file: for line in file: grid.append(line.rstrip()) for ldx,line in enumerate(grid): grid[ldx] = line.translate(str.maketrans("-|F7LJ.", "─│┌┐└┘.")) steps = [] inside = [] #p(grid,steps) found = False start = start_coords(grid) cur = start prev = cur count = 0 def wall(loc): return grid[loc[1]][loc[0]] """ steps = [(3,3),(2,3),(4,3),(3,2),(3,4)] tmps = [] for i in steps: tmps.append(i) p(grid,tmps) input() exit() """ y = cur[0] x = cur[1] print('Right is ' + wall((y+1,x)) + grid[x][y+1],end='') print((y+1,x)) print('Left is ' + wall((y-1,x)) + grid[x][y-1],end='') print((y-1,x)) print('Up is ' + wall((y,x-1)) + grid[x-1][y],end='') print((y,x-1)) print('Down is ' + wall((y,x+1)) + grid[x+1][y],end='') print((y,x+1)) print() p(grid,steps,inside) while not found: y = cur[0] x = cur[1] sub_found = False #print('Start: ' + str(cur) + ' ' + wall(cur)) dirc = '' if len(sys.argv) == 3: p(grid,steps,inside) time.sleep(float(sys.argv[2])) #print('Trying to find way') #print('Previous is ' + str(prev) + wall(prev)) if y+1 < len(grid[0]) and not sub_found: #print('Can go right') # Right new = (list(cur)[0]+1,list(cur)[1]) #print(wall(new)) if grid[x][y+1] in ('─','┐','┘') and new != prev: #print('Trying Right') #print('prev: ' + str(prev) + ' cur: ' + str(cur) + ' new: ' + str(new)) dirc = 'R' if wall(cur) in ('─','┌','└','S'): if wall(new) == 'S': print('Found') found = True #print('Went Right') prev = (y,x) y += 1 #print(wall(new)) sub_found = True if y > 0 and not sub_found: #print('Can go left') # Left new = (list(cur)[0]-1,list(cur)[1]) if grid[x][y-1] in ('─','┌','└') and new != prev: #print('Trying Left') #print('prev: ' + str(prev) + ' cur: ' + str(cur) + ' new: ' + str(new)) dirc = 'L' if wall(cur) in ('─','┐','┘','S'): if wall(new) == 'S': print('Found') found = True #print('Went Left') prev = (y,x) y -= 1 #print(wall(new)) sub_found = True if x > 0 and not sub_found: #print('Can go up') # Up new = (list(cur)[0],list(cur)[1]-1) #print(wall(new)) if grid[x-1][y] in ('│','┌','┐','S') and new != prev: #print('Trying Up') #print('prev: ' + str(prev) + ' cur: ' + str(cur) + ' new: ' + str(new)) dirc = 'U' if wall(cur) in ('│','└','┘','S'): #print('Went Up') if wall(new) == 'S': print('Found') found = True prev = (y,x) x -=1 sub_found = True if x < len(grid) and not sub_found: #print('Can go down') # Down new = (list(cur)[0],list(cur)[1]+1) #print(wall(new)) if grid[x+1][y] in ('│','└','┘','S') and new != prev: #print('Trying Down') #print('prev: ' + str(prev) + ' cur: ' + str(cur) + ' new: ' + str(new)) dirc = 'D' if wall(cur) in ('│','┌','┐','S'): #print('Went Down') if wall(new) == 'S': print('Found') found = True prev = (y,x) x += 1 sub_found = True cur = (y,x) steps.append((x,y)) #p(grid,steps) #print('Going ' + dirc + ' to ' + str(cur) + ' ' + wall(cur)) #print('Previous is ' + str(prev) + ' ' + wall(prev)) #print() #input() count += 1 #print(cur, start) p(grid,steps,inside) print(count) print(count/2) polygon = Polygon(steps) for ydx,y in enumerate(grid): for xdx,x in enumerate(y): if polygon.contains(Point(ydx,xdx)): inside.append((ydx,xdx)) if len(sys.argv) == 4: p(grid,steps,inside,xdx,ydx) time.sleep(float(sys.argv[3])) if len(sys.argv) == 2: p(grid,steps,inside) print(len(inside))