Roderic Day 2年前
コミット
fed5f29a97
1個のファイルの変更36行の追加0行の削除
  1. +36
    -0
      y2022/p18.py

+ 36
- 0
y2022/p18.py ファイルの表示

@@ -0,0 +1,36 @@
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(), max_bubble_size=2000):
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(seen) > max_bubble_size:
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))

読み込み中…
キャンセル
保存