#advent of code 2020 #day 11 directions = [(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]; #for part 1 def scan1(grid,pos): around = ""; y,x = pos; for dy,dx in directions: if (y+dy,x+dx) not in grid: continue; around += grid[(y+dy,x+dx)]; return around; #for part 2 def scan2(grid,pos): around = ""; for dy,dx in directions: y,x = pos; while True: x += dx; y += dy; if (y,x) not in grid: break; elif grid[(y,x)] != ".": around += grid[(y,x)]; break; return around; #correct function is passed as an argument (scan) def simulate(grid,scan,lim): score = 0; while True: gridDupe = dict(); for coordinates in grid: state = grid[coordinates]; y,x = coordinates; around = scan(grid,coordinates); if around.count("#") == 0 and state == "L": gridDupe[coordinates] = "#"; elif around.count("#") >= lim and state == "#": gridDupe[coordinates] = "L"; for dupe in gridDupe: grid[dupe] = gridDupe[dupe]; if len(gridDupe) == 0: break; for coordinates in grid: if grid[coordinates] == "#": score += 1; return score; grid1 = dict(); PuzzleInput = open("11.in","r"); for y,line in enumerate(PuzzleInput): line = line[:-1]; for x, c in enumerate(line): grid1[(y,x)] = c; PuzzleInput.close(); grid2 = grid1.copy(); p1 = simulate(grid1,scan1,4); p2 = simulate(grid2,scan2,5); print("part 1 =",p1); print("part 2 =",p2);