aboutsummaryrefslogtreecommitdiff
path: root/2022/18/solve.py
blob: 540640e78a58199e83e20c38cfcc06c02b4fd52f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np

cubes = set(
    [
        tuple(int(c) for c in dat.split(","))
        for dat in open("input").readlines()
        if dat != ""
    ]
)


def sides(cube):
    i = np.identity(3, dtype=int)
    return set([tuple(cube + m) for m in np.vstack([i, -i])])


def part1():
    return sum(len(sides(cube) - cubes) for cube in cubes)


def part2():
    visited = set()
    q = [(0, 0, 0)]
    high = max(max(np.array(cubes).max(axis=0))) + 1
    while q:
        current = q.pop()
        sub = sides(current) - cubes - visited
        q += [side for side in sub if all(-1 <= val <= high for val in side)]
        visited.add(current)
    return sum((side in visited) for cube in cubes for side in sides(cube))


print(f"Part 1: {part1()}")
print(f"Part 2: {part2()}")