Seating System


Description

You are given a grid representing seats on an airplane. You are trying to model which seats will be occupied or empty.

Each symbol represent an empty seat, occupied seat, or no seat which is the floor as shown below.

Empty seat    (L)
Occupied seat (#)
No seat       (.)

The grid looks like the following.

#.LL.L#.##
#LLLLLL.L#
L.L.L..L..
#LLL.LL.L#
#.LL.LL.LL
#.LLLL#.##
..L.L.....
#LLLLLLLL#
#.LLLLLL.L
#.#LLLL.##

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

Simulate your seating area by applying the seating rules repeatedly until no seats change state. How many seats end up occupied? (Answer in the above example is 37).

Solution

grid = []
for line in grid_text.splitlines():
    if not line:
        continue
    grid.append(list(line))


def get_adj_seats(point):
    occupied = 0
    print(point)
    (y,x) = point
    for dy in (-1,0,1):
        for dx in (-1,0,1):
            if not dy and not dx: # Skip (0,0)
                continue
            y_adj = y + dy
            x_adj = x + dx
            if y_adj >= len(grid):
                continue
            if x_adj >= len(grid[0]):
                continue
            if y_adj < 0:
                continue
            if x_adj < 0:
                continue
            if grid[y_adj][x_adj] == '#':
                occupied += 1
    return occupied

def next_state():
    changes = {}
    for y in range(len(grid)):
        for x in range(len(grid[0])):
            point = (y,x)
            seat = grid[y][x]
            num_occupied = get_adj_seats(point)
            print(num_occupied)
            if seat == 'L':
                if num_occupied == 0:
                    changes[point] = '#'
            if seat == '#':
                if num_occupied >= 4:
                    changes[point] = 'L'
    if not changes:
        return False
    for point in changes:
        (y,x) = point
        grid[y][x] = changes[point]
    return True

while next_state():
    pass

num_seats = 0
for row in grid:
    print(''.join(row))
    for seat in row:
        if seat == '#':
            num_seats+=1
print(num_seats)


Comments

Comment on GitHub