adventofcode/2020/11/kgn.py

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))