135 lines
3.5 KiB
Python
135 lines
3.5 KiB
Python
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')
|
|
|
|
|