Day 11 part 1 of 2020 done in Python
This commit is contained in:
parent
f243461998
commit
b00ae2ab04
2 changed files with 171 additions and 0 deletions
80
2020/Day 11/Solution.py
Normal file
80
2020/Day 11/Solution.py
Normal file
|
@ -0,0 +1,80 @@
|
|||
input_file = "input.txt"
|
||||
|
||||
# -1 is floor
|
||||
# 0 is empty seat
|
||||
# 1 is occupied seat
|
||||
|
||||
# Map represents each cell with [current_state,next_state]
|
||||
# Would a dictionary be better ?
|
||||
seating_map = []
|
||||
|
||||
|
||||
def load_map():
|
||||
with open(input_file) as text_map:
|
||||
line = text_map.readline().strip("\n")
|
||||
|
||||
while line:
|
||||
seating_map.append([])
|
||||
for character in line:
|
||||
# Set every seat to occupied as its the first iteration anyway
|
||||
seating_map[-1].append([1 if character == 'L' else -1, 1])
|
||||
|
||||
line = text_map.readline().strip("\n")
|
||||
|
||||
|
||||
def run_adjacent_seats():
|
||||
"""
|
||||
Run the cellular automata with the following rules :
|
||||
If empty and adjacent are empty, seat
|
||||
If seated and 4 or more neighbours, become empty
|
||||
If floor, pass
|
||||
"""
|
||||
load_map()
|
||||
|
||||
game_stable = False
|
||||
occupied_seats = 0
|
||||
iteration = 0
|
||||
|
||||
while not game_stable:
|
||||
|
||||
for i in range(len(seating_map)):
|
||||
for j in range(len(seating_map[0])):
|
||||
current_cell = seating_map[i][j]
|
||||
if current_cell[0] < 0:
|
||||
continue
|
||||
|
||||
seated_neighbours = 0
|
||||
|
||||
for cell_position in [(i+di, j+dj) for di in [-1, 0, 1] for dj in [-1, 0, 1]]:
|
||||
if cell_position != (i, j) and \
|
||||
0 <= cell_position[0] < len(seating_map) and 0 <= cell_position[1] < len(seating_map[0]):
|
||||
|
||||
seated_neighbours += 1 if seating_map[cell_position[0]][cell_position[1]][0] > 0 else 0
|
||||
|
||||
if current_cell[0] == 0 and seated_neighbours == 0:
|
||||
current_cell[1] = 1
|
||||
elif current_cell[0] == 1 and seated_neighbours >= 4:
|
||||
current_cell[1] = 0
|
||||
|
||||
game_stable = True
|
||||
occupied_seats = 0
|
||||
|
||||
# Should be integrated to the first loop to speed things up
|
||||
for i in range(len(seating_map)):
|
||||
for j in range(len(seating_map[0])):
|
||||
current_cell = seating_map[i][j]
|
||||
if current_cell[0] < 0:
|
||||
continue
|
||||
|
||||
if game_stable and current_cell[0] != current_cell[1]:
|
||||
game_stable = False
|
||||
|
||||
current_cell[0] = current_cell[1]
|
||||
occupied_seats += current_cell[0]
|
||||
|
||||
iteration += 1
|
||||
|
||||
print(f"The number of occupied seats when stabilized is {occupied_seats}")
|
||||
|
||||
|
||||
run_adjacent_seats()
|
Loading…
Add table
Add a link
Reference in a new issue