aoc2020/17/2.py

86 lines
2.6 KiB
Python

with open("input") as f:
content = [x.strip() for x in f]
occupied = "#"
free = "."
dimension = 21
initial = int(dimension/3)
x = y = z = w = initial
def count_4d_neighbours(grid, w, z, y, x):
count = 0
for w_ in range(w-1, w +2):
for z_ in range(z-1, z+2):
for y_ in range(y-1, y+2):
for x_ in range(x-1, x+2):
if grid[w_][z_][y_][x_] == occupied:
count +=1
if grid[w][z][y][x] == occupied:
count -= 1
return count
def count_occupied(grid):
count = 0
for w in range(len(grid)):
for z in range(len(grid[w])):
for y in range(len(grid[w][z])):
count += grid[w][z][y].count(occupied)
return count
def print_grid(grid):
for w in range(len(grid)):
for z in range(len(grid[w])):
count = 0
for y in range(len(grid[w][z])):
count += grid[w][z][y].count(occupied)
if count:
print(f"w={w} z={z}")
for y in range(len(grid[w][z])):
print("".join(grid[w][z][y]))
grid = [None] * dimension
for w in range(len(grid)):
grid[w] = [None] * dimension
for z in range(len(grid[w])):
grid[w][z] = [None] * dimension
for y in range(len(grid[w][z])):
grid[w][z][y] = [free] * dimension
for x in range(initial, initial + len(content)):
for y in range(initial, initial + len(content)):
grid[initial][initial][x][y] = content[x-initial][y-initial]
print_grid(grid)
#print(count_neighbours(grid, initial, initial))
for pass_ in range(6):
newgrid = [free] * dimension
for w in range(len(newgrid)):
newgrid[w] = [free] * dimension
for z in range(len(newgrid[w])):
newgrid[w][z] = [free] * dimension
for y in range(len(newgrid[w][z])):
newgrid[w][z][y] = [free] * dimension
for w in range(1, len(grid) - 1):
for z in range(1, len(grid[w]) - 1):
for y in range(1, len(grid[w][z]) - 1):
for x in range(1, len(grid[w][z][y]) - 1):
neighbours = count_4d_neighbours(grid, w, z, y, x)
if grid[w][z][y][x] == occupied and neighbours not in [2, 3]:
newgrid[w][z][y][x] = free
elif grid[w][z][y][x] == free and neighbours == 3:
newgrid[w][z][y][x] = occupied
else:
newgrid[w][z][y][x] = grid[w][z][y][x]
print(f"pass: {pass_}\n-----------")
print_grid(newgrid)
grid = newgrid.copy()
print(count_occupied(grid))