## DEV Community

Viper

Posted on • Updated on

# Advent of Code 2020: Python Solution Day 24

I knew crab can also navigate but I could not find my best solution to today's challenge so I had to head over to reddit and take help. Credit goes to the author.

``````import re
from collections import defaultdict

with open("day24.txt") as fp:

curr_floor = defaultdict(lambda: False)
for line in lines:
coo = re.findall(r"e|se|sw|w|nw|ne", line)
ns = coo.count("se") + coo.count("sw") - coo.count("ne") - coo.count("nw")
we = coo.count("e") + coo.count("ne") - coo.count("w") - coo.count("sw")

curr_floor[((ns, we))] = not curr_floor[(ns, we)]
print(f"Total tiles with back side up: {sum(list(curr_floor.values()))}")

floor = curr_floor

for _ in range(100):
new_floor = defaultdict(lambda: False)

# Add the outer ring of the current floor for consideration.
for k, v in floor.items():
for o in [(0, -1), (1, -1), (1, 0), (0, 1), (-1, 1), (-1, 0)]:
tile = (k + o, k + o)
if tile not in new_floor:
new_floor[tile] = floor.get(tile, False)
for k, v in new_floor.items():

neighbors = sum([floor[(k + o, k + o)] for o in [(0, -1), (1, -1), (1, 0), (0, 1), (-1, 1), (-1, 0)]])
if v:
if not neighbors or neighbors > 2:
new_floor[k] = False
else:
if neighbors == 2:
new_floor[k] = True

floor = new_floor

print(f"Total tiles with back side up: {sum(list(new_floor.values()))}")

``````