Solution to problem 11 in Python

This commit is contained in:
David Doblas Jiménez 2021-12-04 20:57:59 +01:00
parent 34b9287531
commit 2c9f5f3cbe

176
src/P11.py Normal file
View File

@ -0,0 +1,176 @@
# --- Day 11: Seating System ---
# Your plane lands with plenty of time to spare. The final leg of your journey
# is a ferry that goes directly to the tropical island where you can finally
# start your vacation. As you reach the waiting area to board the ferry, you
# realize you're so early, nobody else has even arrived yet!
# By modeling the process people use to choose (or abandon) their seat in the
# waiting area, you're pretty sure you can predict the best place to sit. You
# make a quick map of the seat layout (your puzzle input).
# The seat layout fits neatly on a grid. Each position is either floor (.), an
# empty seat (L), or an occupied seat (#). For example, the initial seat layout
# might look like this:
# L.LL.LL.LL
# LLLLLLL.LL
# L.L.L..L..
# LLLL.LL.LL
# L.LL.LL.LL
# L.LLLLL.LL
# ..L.L.....
# LLLLLLLLLL
# L.LLLLLL.L
# L.LLLLL.LL
# Now, you just need to model the people who will be arriving shortly.
# Fortunately, people are entirely predictable and always follow a simple set
# of rules. All decisions are based on the number of occupied seats adjacent to
# a given seat (one of the eight positions immediately up, down, left, right,
# or diagonal from the seat). The following rules are applied to every seat
# simultaneously:
# If a seat is empty (L) and there are no occupied seats adjacent to it,
# the seat becomes occupied.
# If a seat is occupied (#) and four or more seats adjacent to it are also
# occupied, the seat becomes empty.
# Otherwise, the seat's state does not change.
# Floor (.) never changes; seats don't move, and nobody sits on the floor.
# After one round of these rules, every seat in the example layout becomes
# occupied:
# #.##.##.##
# #######.##
# #.#.#..#..
# ####.##.##
# #.##.##.##
# #.#####.##
# ..#.#.....
# ##########
# #.######.#
# #.#####.##
# After a second round, the seats with four or more occupied adjacent seats
# become empty again:
# #.LL.L#.##
# #LLLLLL.L#
# L.L.L..L..
# #LLL.LL.L#
# #.LL.LL.LL
# #.LLLL#.##
# ..L.L.....
# #LLLLLLLL#
# #.LLLLLL.L
# #.#LLLL.##
# This process continues for three more rounds:
# #.##.L#.##
# #L###LL.L#
# L.#.#..#..
# #L##.##.L#
# #.##.LL.LL
# #.###L#.##
# ..#.#.....
# #L######L#
# #.LL###L.L
# #.#L###.##
# #.#L.L#.##
# #LLL#LL.L#
# L.L.L..#..
# #LLL.##.L#
# #.LL.LL.LL
# #.LL#L#.##
# ..L.L.....
# #L#LLLL#L#
# #.LLLLLL.L
# #.#L#L#.##
# #.#L.L#.##
# #LLL#LL.L#
# L.#.L..#..
# #L##.##.L#
# #.#L.LL.LL
# #.#L#L#.##
# ..L.L.....
# #L#L##L#L#
# #.LLLLLL.L
# #.#L#L#.##
# At this point, something interesting happens: the chaos stabilizes and
# further applications of these rules cause no seats to change state! Once
# people stop moving around, you count 37 occupied seats.
# Simulate your seating area by applying the seating rules repeatedly until no
# seats change state. How many seats end up occupied?
with open("files/P11.txt", "r") as f:
seats = [line for line in f.read().strip().split("\n")]
def seats_around(seats: list[str], r: int, c: int) -> int:
total = 0
around_me = [
(-1, -1),
(-1, 0),
(-1, 1),
(0, -1),
(0, 1),
(1, -1),
(1, 0),
(1, 1),
]
for row, col in around_me:
_row = r + row
_col = c + col
if (
_row >= 0
and _row < len(seats)
and _col >= 0
and _col < len(seats[c])
):
total += seats[_row][_col] == "#"
return total
def free_seats(v: list[str]) -> int:
total = 0
for row in v:
total += row.count("#")
return total
def part_1(seats: list[str]) -> None:
R = len(seats)
C = len(seats[0])
while True:
has_changed = False
next_iter = []
for r in range(R):
new_row = ""
for c in range(C):
seat = seats[r][c]
if seat != ".":
occupants = seats_around(seats, r, c)
if seat == "L" and occupants == 0:
seat = "#"
has_changed = True
elif seat == "#" and occupants >= 4:
seat = "L"
has_changed = True
new_row += seat
next_iter.append(new_row)
if not has_changed:
break
seats = next_iter
print(f"There are {free_seats(seats)} seats occupied")
if __name__ == "__main__":
part_1(seats)