You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.1 KiB
Python
50 lines
1.1 KiB
Python
4 years ago
|
data = open('input', 'r').readlines()
|
||
|
data = [list(x.strip()) for x in data]
|
||
|
|
||
|
|
||
|
def neighbors(mat, x, y):
|
||
|
height = len(mat)
|
||
|
width = len(mat[0])
|
||
|
for i in range(3):
|
||
|
for j in range(3):
|
||
|
dx = i - 1
|
||
|
dy = j - 1
|
||
|
if dx == 0 and dy == 0:
|
||
|
continue
|
||
|
if x + dx < 0 or y + dy < 0:
|
||
|
continue
|
||
|
if x + dx >= height or y + dy >= width:
|
||
|
continue
|
||
|
yield data[x + dx][y+dy]
|
||
|
|
||
|
|
||
|
def serialize(mat):
|
||
|
return '\n'.join([''.join(line) for line in mat])
|
||
|
|
||
|
|
||
|
def apply(mat):
|
||
|
newData = []
|
||
|
for x, _ in enumerate(mat):
|
||
|
line = []
|
||
|
for y, _ in enumerate(mat[x]):
|
||
|
neigh = list(neighbors(mat, x, y))
|
||
|
if mat[x][y] == 'L' and '#' not in neigh:
|
||
|
line.append('#')
|
||
|
elif mat[x][y] == '#' and neigh.count('#') >= 4:
|
||
|
line.append('L')
|
||
|
else:
|
||
|
line.append(mat[x][y])
|
||
|
newData.append(line)
|
||
|
return newData
|
||
|
|
||
|
|
||
|
prev = ''
|
||
|
|
||
|
while serialize(data) != prev:
|
||
|
prev = serialize(data)
|
||
|
data = apply(data)
|
||
|
|
||
|
|
||
|
# print(serialize(data))
|
||
|
print(prev.count('#'))
|