+#!/usr/bin/python3
+
+import sys
+import copy
+
+cubemap={}
+min_w=0
+max_w=0
+min_z=0
+max_z=0
+min_x=0
+max_x=0
+min_y=0
+max_y=0
+
+filename="p1_example.txt"
+if len(sys.argv) > 1:
+ filename=sys.argv[1]
+
+def get_active_neighbours(x,y,z,w):
+ global cubemap
+ sum=0
+ for cur_w in range(w-1, w+2):
+ for cur_z in range(z-1, z+2):
+ for cur_y in range(y-1, y+2):
+ for cur_x in range(x-1, x+2):
+ if w == cur_w and x == cur_x and y == cur_y and z == cur_z:
+ continue
+ else:
+ if cur_w in cubemap:
+ if cur_z in cubemap[cur_w]:
+ if cur_y in cubemap[cur_w][cur_z]:
+ if cur_x in cubemap[cur_w][cur_z][cur_y]:
+ if cubemap[cur_w][cur_z][cur_y][cur_x] == "#":
+ sum+=1
+
+ return sum
+
+def do_iteration():
+ global cubemap,min_w,max_w,min_x,max_x,min_y,max_y,min_z,max_z
+
+ min_x-=1
+ max_x+=1
+ min_y-=1
+ max_y+=1
+ min_z-=1
+ max_z+=1
+ min_w-=1
+ max_w+=1
+
+ new_cubemap=copy.deepcopy(cubemap)
+
+ for w in range(min_w, max_w+1):
+ for z in range(min_z, max_z+1):
+ for y in range(min_y, max_y+1):
+ for x in range(min_x, max_x+1):
+ active_neighbours=get_active_neighbours(x,y,z,w)
+ if not w in cubemap:
+ new_cubemap[w]={}
+ cubemap[w]={}
+ if not z in cubemap[w]:
+ new_cubemap[w][z]={}
+ cubemap[w][z]={}
+ if not y in cubemap[w][z]:
+ new_cubemap[w][z][y]={}
+ cubemap[w][z][y]={}
+ if not x in cubemap[w][z][y]:
+ new_cubemap[w][z][y][x]="."
+ cubemap[w][z][y][x]="."
+ if cubemap[w][z][y][x] == "#" and active_neighbours != 2 and active_neighbours != 3:
+ new_cubemap[w][z][y][x]="."
+ elif cubemap[w][z][y][x] == "." and active_neighbours == 3:
+ new_cubemap[w][z][y][x]="#"
+
+ cubemap=new_cubemap
+
+# read the file
+w=0
+z=0
+y=0
+cubemap[w]={}
+cubemap[w][z]={}
+for line in open(filename, "r"):
+ line=line.rstrip()
+ cubemap[w][z][y]={}
+ x=0
+ for char in line:
+ cubemap[w][z][y][x]=char
+ x+=1
+ max_x=x-1
+ y+=1
+max_y=y-1
+
+for iteration in range(0,6):
+ print("Iteration:", iteration+1)
+ do_iteration()
+ #print_map()
+
+active=0
+for w in cubemap.keys():
+ for z in cubemap[w].keys():
+ for y in cubemap[w][z].keys():
+ for x in cubemap[w][z][y].keys():
+ if cubemap[w][z][y][x]=="#":
+ active+=1
+
+print("Active cubes:", active)