From c27d4e089c7dd2e6c1561c3781634ba5215f71d8 Mon Sep 17 00:00:00 2001 From: nekineki Date: Sun, 18 Dec 2022 07:01:48 +0100 Subject: day18 --- 2022/day18.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 2022/day18.py (limited to '2022/day18.py') 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) + -- cgit v1.2.3