from lib import get_data, add2 from collections import defaultdict DIRS = { "e": (0, 2), "w": (0, -2), "se": (1, 1), "sw": (1, -1), "nw": (-1, -1), "ne": (-1, 1), } data = get_data(__file__) tiles_black = set() for row in data.splitlines(): row = row.strip() i = 0 pos = (0, 0) while i < len(row): d = None if row[i] in DIRS: d = DIRS[row[i]] i += 1 elif "".join(row[i : i + 2]) in DIRS: d = DIRS["".join(row[i : i + 2])] i += 2 else: assert False assert d is not None pos = add2(pos, d) if pos in tiles_black: tiles_black.remove(pos) else: tiles_black.add(pos) print(len(tiles_black)) for _ in range(100): nbs = defaultdict(int) for bt in tiles_black: for d in DIRS.values(): nb = add2(bt, d) nbs[nb] += 1 new_tiles_black = set() for pos, count in nbs.items(): if pos in tiles_black: if count == 0 or count > 2: pass else: new_tiles_black.add(pos) else: if count == 2: new_tiles_black.add(pos) tiles_black = new_tiles_black print(len(tiles_black))