diff options
Diffstat (limited to '2022/day18.py')
| -rwxr-xr-x | 2022/day18.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/2022/day18.py b/2022/day18.py new file mode 100755 index 0000000..92b0583 --- /dev/null +++ b/2022/day18.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 + +# import numpy as np +from functools import reduce +from re import findall +from copy import deepcopy +import sys + +# filename = "in/day18.ref" +filename = "in/day18.pzl" +data = open(filename).read() +lines = [line for line in data.rstrip('\n').split('\n')] +# print(lines) + +D = dict() + +for line in lines: + x,y,z = [int(i) for i in line.split(',')] + D[(x,y,z)] = 1 +# print(D) + +side_len = 0 +for x,y,z in D.keys(): + side_len = max(side_len, x, y, z) +side_len += 1 +# print(side_len) + +res1 = 0 +for x,y,z in D.keys(): + for dx,dy,dz in [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]: + if (x+dx,y+dy,z+dz) not in D: + res1 += 1 + + +def bfs(visited): + while True: + start_len = len(visited) + new_visited = set() + for x,y,z in visited: + for dx,dy,dz in [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]: + if ((x+dx,y+dy,z+dz) not in visited) and \ + -1 <= x+dx < side_len+1 and \ + -1 <= y+dy < side_len+1 and \ + -1 <= z+dz < side_len+1 and \ + ((x+dx,y+dy,z+dz) not in D): + new_visited.add((x+dx,y+dy,z+dz)) + + visited = visited.union(new_visited) + if len(visited) == start_len: + return visited + +# O(n**3) +E = set() +for x in range(-1, side_len+1): + for y in range(-1, side_len+1): + for z in range(-1, side_len+1): + if max(x,y,z) == side_len or min(x,y,z) == -1: + E.add((x,y,z)) +E = bfs(E) +# print(E) + +res2 = 0 +for x,y,z in D.keys(): + for dx,dy,dz in [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]: + if (x+dx,y+dy,z+dz) in E: + res2 += 1 + +print('res1:', res1) +print('res2:', res2) + |
