Files
aoc2020/day17/module.py

130 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
import functools
def pw(line):
return line.strip()
def p1():
inp = get_input(pw)
cube = {}
print(inp)
ymin = 0
xmin = 0
zmin = 0
ymax = len(inp)-1
xmax = len(inp[0]) - 1
zmax = 0
for y, sample in enumerate(inp):
z = 0
for x, v in enumerate(sample):
if v == '#':
cube[(x, y, z)] = v
arround = [(x,y,z) for x in range(-1, 2) for y in range(-1, 2) for z in range(-1, 2)]
for _ in range(6):
newcube = {}
for zi in range(zmin-1, zmax+2):
for yi in range(ymin-1, ymax+2):
for xi in range(xmin-1, xmax+2):
count = 0
for xo, yo, zo in arround:
if xo == 0 and yo == 0 and zo == 0:
continue
if (xi+xo, yi+yo, zi+zo) in cube:
#print((xi+xo, yi+yo, zi+zo), '#')
count += 1
#print((xi, yi, zi), count)
if (xi, yi, zi) in cube:
if count in [2,3]:
newcube[(xi, yi, zi)] = '#'
else:
if count == 3:
newcube[(xi, yi, zi)] = '#'
zmin -= 1
zmax += 1
ymin -= 1
ymax += 1
xmin -= 1
xmax += 1
cube = copy.copy(newcube)
print(len(cube))
print(len(cube))
return inp
def p2():
inp = get_input(pw)
plane = inp
cube = set()
print(inp)
ymin = 0
xmin = 0
zmin = 0
ymax = len(inp)-1
xmax = len(inp[0]) - 1
zmax = 0
wmax = 0
wmin = 0
for y, sample in enumerate(inp):
z = 0
for x, v in enumerate(sample):
if v == '#':
cube.add((x, y, z, 0))
arround = [(x,y,z, w) for x in range(-1, 2) for y in range(-1, 2) for z in range(-1, 2) for w in range(-1, 2)]
for _ in range(6):
newcube = set()
for wi in range(wmin-1, wmax+2):
for zi in range(zmin-1, zmax+2):
for yi in range(ymin-1, ymax+2):
for xi in range(xmin-1, xmax+2):
count = 0
for xo, yo, zo, wo in arround:
if xo == 0 and yo == 0 and zo == 0 and wo == 0:
continue
if (xi+xo, yi+yo, zi+zo, wi+wo) in cube:
#print((xi+xo, yi+yo, zi+zo), '#')
count += 1
#print((xi, yi, zi), count)
if (xi, yi, zi, wi) in cube:
if count in [2,3]:
newcube.add((xi, yi, zi, wi))
else:
if count == 3:
newcube.add((xi, yi, zi, wi))
wmin -= 1
wmax += 1
zmin -= 1
zmax += 1
ymin -= 1
ymax += 1
xmin -= 1
xmax += 1
cube = copy.copy(newcube)
print(len(cube))
print(len(cube))
return inp
return 0
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()
print(round(1000*(time.time() - start), 2), 'ms')