day 11
This commit is contained in:
132
day11/module.py
Normal file
132
day11/module.py
Normal file
@@ -0,0 +1,132 @@
|
||||
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')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user