Files
aoc2020/day11/module.py
2020-12-11 08:15:36 +01:00

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')