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) grid = {} width = len(inp[0]) height = len(inp) for y, sample in enumerate(inp): for x, o in enumerate(sample): grid[(x,y)] = 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[(x+ax, y+ay)] == '#': count += 1 except: pass if count == 0 and grid[(x,y)] == 'L': newgrid[(x,y)] = '#' changed = True ccnt += 1 if count >= 4 and grid[(x,y)] == '#': newgrid[(x,y)] = 'L' changed = True ccnt += 1 grid = newgrid count = 0 if draw(): for y in range(height): for x in range(width): print(grid[(x,y)], end='') if grid[(x,y)] == '#': count += 1 print() print(count) return inp def p2(inp): grid = {} width = len(inp[0]) height = len(inp) for y, sample in enumerate(inp): for x, o in enumerate(sample): grid[(x,y)] = 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[(x,y)] == '.': continue count = 0 for ax, ay in adj: ax1 = ax ay1 = ay while True: try: if grid[(x+ax, y+ay)] == '.': ax += ax1 ay += ay1 else: break except: break try: if grid[(x+ax, y+ay)] == '#': count += 1 except: pass if count == 0 and grid[(x,y)] == 'L': newgrid[(x,y)] = '#' changed = True ccnt += 1 if count >= 5 and grid[(x,y)] == '#': newgrid[(x,y)] = 'L' changed = True ccnt += 1 grid = newgrid count = 0 if draw(): for y in range(height): for x in range(width): print(grid[(x,y)], end='') if grid[(x,y)] == '#': count += 1 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')