from aoc.input import get_input import copy import itertools import time import collections import re from aoc.partselector import part_one, part_two, draw import functools def pw(line): return list(line.strip()) def p1(): inp = get_input(pw) width = len(inp[0]) height = len(inp) grid = [['' for y in x] for x in inp] for y, sample in enumerate(inp): for x, o in enumerate(sample): grid[y][x] = o changed = True adj = [(-1, 0), (0, -1), (1, 0), (0, 1), (1,-1), (1,1), (-1, 1), (-1, -1)] while changed: newgrid = copy.copy(grid) ccnt = 0 changed = False for y in range(height): for x in range(width): count = 0 for ax, ay in adj: try: if grid[y+ay][x+ax] == '#': count += 1 except: pass if count == 0 and grid[y][x] == 'L': newgrid[y][x] = '#' changed = True ccnt += 1 if count >= 4 and grid[y][x] == '#': newgrid[y][x] = 'L' changed = True ccnt += 1 grid = newgrid count = 0 for y in range(height): for x in range(width): if draw(): print(grid[y][x], end='') if grid[y][x] == '#': count += 1 if draw(): print() print(count) return inp def p2(inp): width = len(inp[0]) height = len(inp) grid = [['' for y in x] for x in inp] for y, sample in enumerate(inp): for x, o in enumerate(sample): grid[y][x] = o changed = True adj = [(-1, 0), (0, -1), (1, 0), (0, 1), (1,-1), (1,1), (-1, 1), (-1, -1)] while changed: newgrid = copy.copy(grid) ccnt = 0 changed = False for y in range(height): for x in range(width): if grid[y][x] == '.': continue count = 0 for ax, ay in adj: ax1 = ax ay1 = ay while True: try: if grid[y+ay][x+ax] == '.': ax += ax1 ay += ay1 else: break except: break try: if grid[y+ay][x+ax] == '#': count += 1 except: pass if count == 0 and grid[y][x] == 'L': newgrid[y][x] = '#' changed = True ccnt += 1 if count >= 5 and grid[y][x] == '#': newgrid[y][x] = 'L' changed = True ccnt += 1 grid = newgrid count = 0 for y in range(height): for x in range(width): if draw(): print(grid[y][x], end='') if grid[y][x] == '#': count += 1 if draw(): print() print(count) return inp result1 = None if part_one(): start = time.time() result1 = p1() print(round(1000*(time.time() - start), 2), 'ms') if part_two(): start = time.time() p2(result1) print(round(1000*(time.time() - start), 2), 'ms')