from copy import deepcopy from termcolor import colored def show(array): for z in range(0, len(array)): print(colored('\nz = ' + str(z), 'yellow')) for i in range(0, len(array[z])): print(colored(''.join(array[z][i]), 'blue')) def show4(array): for w in range(0, len(array)): print(colored('\nw = ' + str(w), 'magenta')) for z in range(0, len(array[w])): print(colored('\nz = ' + str(z), 'yellow')) for i in range(0, len(array[w][z])): print(colored(''.join(array[w][z][i]), 'blue')) def oob(space, z, y, x): if z < 0: return True if z >= len(space): return True if y < 0: return True if y >= len(space[z]): return True if x < 0: return True if x >= len(space[z][y]): return True return False def oob4(space, w, z, y, x): if w < 0: return True if w >= len(space): return True if z < 0: return True if z >= len(space[w]): return True if y < 0: return True if y >= len(space[w][z]): return True if x < 0: return True if x >= len(space[w][z][y]): return True return False def neighbors(space, z, y, x): dirs = [(z, y, x) for x in [0, 1, -1] for y in [0, 1, -1] for z in [0, 1, -1]] dirs.remove((0, 0, 0)) for d in dirs: if not oob(space, z+d[0], y+d[1], x+d[2]): yield space[z+d[0]][y+d[1]][x+d[2]] def neighbors4(space, w, z, y, x): dirs = [(w, z, y, x) for x in [0, 1, -1] for y in [0, 1, -1] for z in [0, 1, -1] for w in [0, 1, -1]] dirs.remove((0, 0, 0, 0)) for d in dirs: if not oob4(space, w+d[0], z+d[1], y+d[2], x+d[3]): yield space[w+d[0]][z+d[1]][y+d[2]][x+d[3]] def step(array): next = deepcopy(array) for z in range(0, len(array)): for y in range(0, len(array[z])): for x in range(0, len(array[z][y])): c = [i for i in neighbors(array, z, y, x)].count('#') if array[z][y][x] == '#' and not (c == 2 or c == 3): next[z][y][x] = '.' if array[z][y][x] == '.' and c == 3: next[z][y][x] = '#' return next def step4(array): next = deepcopy(array) for w in range(0, len(array)): for z in range(0, len(array[w])): for y in range(0, len(array[w][z])): for x in range(0, len(array[w][z][y])): c = [i for i in neighbors4(array, w, z, y, x)].count('#') if array[w][z][y][x] == '#' and not (c == 2 or c == 3): next[w][z][y][x] = '.' if array[w][z][y][x] == '.' and c == 3: next[w][z][y][x] = '#' return next with open(r"C:\Users\Maya\Desktop\Uni\WS_2021\AoC\input17") as f: lines = f.readlines() lines = [list(l) for l in lines] empty = [[['.' for i in range(20)] for j in range(20)] for k in range(13)] for i in range(0, 8): for j in range(0, 8): empty[6][j+6][i+6] = lines[j][i] show(empty) for i in range(0, 6): print(colored('\n\nstep: ' + str(i+1) + '\n', 'red')) empty = step(empty) show(empty) count = 0 for i in range(0, 13): for j in range(0, 20): count += empty[i][j].count('#') print(colored(count, 'cyan')) hypercube = [[[['.' for i in range(20)] for j in range(20)] for k in range(13)] for l in range(13)] for i in range(0, 8): for j in range(0, 8): hypercube[6][6][j+6][i+6] = lines[j][i] for i in range(0, 6): print(colored('\n\nstep: ' + str(i + 1) + '\n', 'red')) hypercube = step4(hypercube) show4(hypercube) count4 = 0 for i in range(0, 13): for j in range(0, 13): for k in range(0, 20): count4 += hypercube[i][j][k].count('#') print(colored(count4, 'cyan'))