64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
import copy
|
|
|
|
|
|
def mutate(seats, seatscopy, row, col, nocc, visible):
|
|
changed = False
|
|
if seats[row][col] == 'L':
|
|
if nocc == 0:
|
|
seatscopy[row][col] = '#'
|
|
changed = True
|
|
elif seats[row][col] == '#':
|
|
if nocc >= visible:
|
|
seatscopy[row][col] = 'L'
|
|
changed = True
|
|
|
|
return changed
|
|
|
|
|
|
def occ(seats, numseats, seatlen, row, col, visible):
|
|
nocc = 0
|
|
for dr in [-1, 0, 1]:
|
|
for dc in [-1, 0, 1]:
|
|
if not (dr == 0 and dc == 0):
|
|
rr = row + dr
|
|
cc = col + dc
|
|
|
|
if visible > 4:
|
|
while 0 <= rr < numseats and 0 <= cc < seatlen and seats[rr][cc] == '.':
|
|
rr = rr + dr
|
|
cc = cc + dc
|
|
|
|
if 0 <= rr < numseats:
|
|
if 0 <= cc < seatlen:
|
|
if seats[rr][cc] == '#':
|
|
nocc += 1
|
|
return nocc
|
|
|
|
|
|
def solve(seats, visible):
|
|
numseats = len(seats)
|
|
seatlen = len(seats[0])
|
|
while True:
|
|
seatscopy = copy.deepcopy(seats)
|
|
changed = False
|
|
for row in range(numseats):
|
|
for col in range(seatlen):
|
|
nocc = occ(seats, numseats, seatlen, row, col, visible)
|
|
changed |= mutate(seats, seatscopy, row, col, nocc, visible)
|
|
|
|
if not changed:
|
|
break
|
|
seats = copy.deepcopy(seatscopy)
|
|
|
|
result = 0
|
|
for row in range(numseats):
|
|
for col in range(seatlen):
|
|
if seats[row][col] == '#':
|
|
result += 1
|
|
return result
|
|
|
|
|
|
with open('data.txt', 'r') as f:
|
|
seats = [list(x.strip()) for x in f.readlines()]
|
|
print(solve(seats, 4))
|
|
print(solve(seats, 5))
|