advent-of-code/2015-python/solutions/day_18.py

80 lines
2.1 KiB
Python
Raw Normal View History

from collections import defaultdict
from solutions import BaseSolution
N = [
(-1, -1),
(-1, 0),
(-1, 1),
(0, -1),
(0, 1),
(1, -1),
(1, 0),
(1, 1),
]
class Solution(BaseSolution):
input_file = "18.txt"
def __str__(self):
return "Day 18: Like a GIF For Your Yard"
def parse_input(self, data):
return data.strip()
def solve(self, data):
m = defaultdict(bool)
rows = data.split()
h = len(rows)
w = len(rows[0])
for r in range(h):
for c in range(w):
m[(r, c)] = 1 if rows[r][c] == "#" else 0
for _ in range(100):
nm = defaultdict(bool)
for r in range(h):
for c in range(w):
n = sum(m[(r + nr, c + nc)] for nr, nc in N)
match m[(r, c)]:
case 1:
nm[(r, c)] = n in (2, 3)
case 0:
nm[(r, c)] = n == 3
m = nm
return sum(m.values())
def solve_again(self, data):
m = defaultdict(bool)
rows = data.split()
h = len(rows)
w = len(rows[0])
for r in range(h):
for c in range(w):
m[(r, c)] = 1 if rows[r][c] == "#" else 0
m[(0, 0)] = True
m[(99, 0)] = True
m[(99, 99)] = True
m[(0, 99)] = True
for _ in range(100):
nm = defaultdict(bool)
for r in range(h):
for c in range(w):
if (r, c) in [(0, 0), (99, 0), (99, 99), (0, 99)]:
nm[(r, c)] = True
continue
n = sum(m[(r + nr, c + nc)] for nr, nc in N)
match m[(r, c)]:
case 1:
nm[(r, c)] = n in (2, 3)
case 0:
nm[(r, c)] = n == 3
m = nm
return sum(m.values())
return True
if __name__ == "__main__":
solution = Solution()
solution.show_results()