My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add 2022/18

+95
+95
2022/day18.py
··· 1 + import fileinput 2 + from collections import deque 3 + 4 + from utils import parse_nums, memoize 5 + 6 + 7 + cubes = [] 8 + 9 + min_x = 1e9 10 + max_x = -1e9 11 + min_y = 1e9 12 + max_y = -1e9 13 + min_z = 1e9 14 + max_z = -1e9 15 + 16 + for line in fileinput.input(): 17 + x, y, z = parse_nums(line) 18 + cubes.append((x, y, z)) 19 + min_x = min(x, min_x) 20 + max_x = max(x, max_x) 21 + min_y = min(y, min_y) 22 + max_y = max(y, max_y) 23 + min_z = min(z, min_z) 24 + max_z = max(z, max_z) 25 + 26 + cubes = set(cubes) 27 + 28 + 29 + OFFSETS = [ 30 + (-1, 0, 0), 31 + (1, 0, 0), 32 + (0, -1, 0), 33 + (0, 1, 0), 34 + (0, 0, -1), 35 + (0, 0, 1), 36 + ] 37 + 38 + def outside(x, y, z): 39 + xx = min_x <= x < max_x 40 + yy = min_y <= y < max_y 41 + zz = min_z <= z < max_z 42 + return not (xx and yy and zz) 43 + 44 + 45 + KNOWN_INTERNALS = set() 46 + 47 + def is_internal(node): 48 + global KNOWN_INTERNALS 49 + 50 + seen = set() 51 + horizon = deque([node]) 52 + 53 + while horizon: 54 + n = horizon.popleft() 55 + x, y, z = n 56 + 57 + if n in seen: 58 + continue 59 + 60 + if n in KNOWN_INTERNALS: 61 + return True 62 + 63 + if outside(*n): 64 + return False 65 + 66 + seen.add(n) 67 + 68 + for dx, dy, dz in OFFSETS: 69 + nx = x + dx 70 + ny = y + dy 71 + nz = z + dz 72 + 73 + if (nx, ny, nz) in cubes: 74 + continue 75 + 76 + horizon.append((nx, ny, nz)) 77 + 78 + # We are internal, so add everything we've seen to KNOWN_INTERNALS. 79 + KNOWN_INTERNALS |= seen 80 + 81 + return True 82 + 83 + part_1 = 0 84 + part_2 = 0 85 + 86 + for x, y, z in cubes: 87 + for dx, dy, dz in OFFSETS: 88 + nx, ny, nz = x + dx, y + dy, z + dz 89 + if (nx, ny, nz) not in cubes: 90 + part_1 += 1 91 + if not is_internal((nx, ny, nz)): 92 + part_2 += 1 93 + 94 + print("Part 1:", part_1) 95 + print("Part 2:", part_2)