| def move(pt): | |||||
| x, y, z = pt | |||||
| for dx in [1, 0, -1]: | |||||
| for dy in [1, 0, -1]: | |||||
| for dz in [1, 0, -1]: | |||||
| if abs(dx) + abs(dy) + abs(dz) == 1: | |||||
| yield x + dx, y + dy, z + dz | |||||
| def is_outside(pt, outside=set(), inside=set(), tune_f=150): | |||||
| edge = {pt} | |||||
| seen = set() | |||||
| while True: | |||||
| edge = {adj_pt for pt in edge for adj_pt in move(pt)} - seen - cubes | |||||
| seen |= edge | |||||
| if seen & outside or len(edge) > tune_f: | |||||
| outside |= seen | |||||
| return True | |||||
| if seen & inside or not edge: | |||||
| inside |= seen | |||||
| return False | |||||
| def solve(is_outside=lambda *args: True): | |||||
| surface = 0 | |||||
| for pt in cubes: | |||||
| for adj_pt in move(pt): | |||||
| if adj_pt not in cubes and is_outside(adj_pt): | |||||
| surface += 1 | |||||
| return surface | |||||
| text = open(0).read() | |||||
| cubes = {tuple(map(int, ln.split(','))) for ln in text.splitlines()} | |||||
| print(solve()) | |||||
| print(solve(is_outside)) |