from sys import stdin elves = set() for y, line in enumerate(stdin): for x, c in enumerate(line): if c == '#': elves.add((x, y)) def tadd(a, b): return tuple(map(sum, zip(a, b))) def move(elf, elves, phase): def singlemove(phase): phase = phase % 4 d = None if phase == 0: d = (0, -1) if phase == 1: d = (0, +1) if phase == 2: d = (-1, 0) if phase == 3: d = (+1, 0) colls = [] for n in [-1, 0, 1]: v = list(d) v[v.index(0)] = n v = tadd(elf, v) if v in elves: return None return tadd(elf, d) def crowded(): for dx in [-1, 0, 1]: for dy in [-1, 0, 1]: if dx == dy == 0: continue if tadd(elf, (dx, dy)) in elves: return True return False if not crowded(): return elf for i in range(4): r = singlemove(phase + i) if r: return r return elf def step(elves, phase): goals = set() dupes = set() after = set() for elf in elves: g = move(elf, elves, phase) if g in goals: dupes.add(g) else: goals.add(g) for elf in elves: g = move(elf, elves, phase) after.add(elf if g in dupes else g) return after for i in range(10): elves = step(elves, i) xs = [t[0] for t in elves] ys = [t[1] for t in elves] score = (max(xs) - min(xs) + 1) * (max(ys) - min(ys) + 1) - len(elves) print(score)