130 lines
2.8 KiB
Python
130 lines
2.8 KiB
Python
def count_adjacent(grid, line, seat):
|
|
h = len(grid) - 1
|
|
w = len(grid[0]) - 1
|
|
# generate lists
|
|
#
|
|
# D1 V1 D2
|
|
# H1 XX H2
|
|
# D3 V2 D4
|
|
#
|
|
# vertical lists
|
|
adj = 0
|
|
if line > 0:
|
|
for x in range(line - 1, -1, -1):
|
|
if grid[x][seat] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[x][seat] == "L":
|
|
break
|
|
|
|
if line < w:
|
|
for x in range(line + 1, len(grid)):
|
|
if grid[x][seat] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[x][seat] == "L":
|
|
break
|
|
|
|
# horizontal lists
|
|
if seat > 0:
|
|
for s in range(seat - 1, -1, -1):
|
|
if grid[line][s] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[line][s] == "L":
|
|
break
|
|
for s in range(seat + 1, w+1):
|
|
if grid[line][s] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[line][s] == "L":
|
|
break
|
|
|
|
|
|
# diagonal lists
|
|
s = seat - 1
|
|
l = line - 1
|
|
for __ in range(min(line, seat)):
|
|
if grid[l][s] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[l][s] == "L":
|
|
break
|
|
l -=1
|
|
s -=1
|
|
|
|
s = seat + 1
|
|
l = line - 1
|
|
for __ in range(min(line, w - seat)):
|
|
if grid[l][s] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[l][s] == "L":
|
|
break
|
|
l -=1
|
|
s +=1
|
|
|
|
s = seat - 1
|
|
l = line + 1
|
|
for __ in range(min(h - line, seat)):
|
|
if grid[l][s] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[l][s] == "L":
|
|
break
|
|
l +=1
|
|
s -=1
|
|
|
|
s = seat + 1
|
|
l = line + 1
|
|
for __ in range(min(h - line, w - seat)):
|
|
if grid[l][s] == "#":
|
|
adj += 1
|
|
break
|
|
if grid[l][s] == "L":
|
|
break
|
|
l +=1
|
|
s +=1
|
|
|
|
return adj
|
|
|
|
with open("input") as f:
|
|
content = [[y for y in x.strip()] for x in f]
|
|
|
|
new = last = content
|
|
|
|
changes = 1
|
|
#for line in content:
|
|
# print("".join(line))
|
|
|
|
iterations = 0
|
|
while changes > 0:
|
|
iterations += 1
|
|
last = []
|
|
for line in new:
|
|
last.append(line.copy())
|
|
changes = 0
|
|
for line in range(len(last)):
|
|
adjs = []
|
|
for seat in range(len(last[line])):
|
|
status = last[line][seat]
|
|
adj = count_adjacent(last, line, seat)
|
|
adjs.append(str(adj))
|
|
if status == "L" and adj == 0:
|
|
new[line][seat] = "#"
|
|
changes += 1
|
|
elif status == "#" and adj >= 5:
|
|
new[line][seat] = "L"
|
|
changes += 1
|
|
# print("".join(adjs), "".join(new[line]))
|
|
|
|
#for line in new:
|
|
# print("".join(line))
|
|
|
|
|
|
count = 0
|
|
for line in last:
|
|
count += line.count("#")
|
|
|
|
print(count)
|