80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
|
|
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()
|