60 lines
1.3 KiB
Python
60 lines
1.3 KiB
Python
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))
|