Advertisement
Guest User

Untitled

a guest
Dec 18th, 2020
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.69 KB | None | 0 0
  1.  
  2. FLOOR = '.'
  3. EMPTY = 'L'
  4. OCCUPIED = '#'
  5.  
  6. def n_occupied(seat: str) -> int:
  7.     ''' Returns 1 if occupied and 0 if not. '''
  8.     return 1 if seat == OCCUPIED else 0
  9.  
  10.  
  11. def compute_next_gen(grid: str, stride: int) -> str:
  12.     next_gen = []
  13.     for i, seat in enumerate(grid):
  14.         if seat == FLOOR:
  15.             next_gen.append(FLOOR)
  16.             continue
  17.         # Compute occupied adjacents; add left, right, above and below.
  18.         occupied_neighbors = n_occupied(grid[i - 1]) \
  19.                            + n_occupied(grid[i + 1]) \
  20.                            + n_occupied(grid[i - stride]) \
  21.                            + n_occupied(grid[i + stride])
  22.         if n_occupied(seat) == 0:
  23.             next_gen.append(OCCUPIED if occupied_neighbors == 0 else EMPTY)
  24.         else:
  25.             next_gen.append(OCCUPIED if occupied_neighbors < 4 else EMPTY)
  26.     return ''.join(next_gen)
  27.  
  28.  
  29. def compute_steady_state(grid: str, width: int) -> str:
  30.     # Make sure the grid is well formed.
  31.     assert len(grid) % width == 0
  32.  
  33.     stride = width + 2
  34.     # Surround the grid with empties so we don't have to do special casing for
  35.     # edges in copmute_next_gen. Instead we could use a real position and
  36.     working_grid = []
  37.     working_grid.extend(FLOOR * stride) # Top row
  38.     for row_span_start in range(0, len(grid), width):
  39.         row_span_end = row_span_start + width
  40.         working_grid.append(FLOOR)
  41.         working_grid.append(grid[row_span_start:row_span_end])
  42.         working_grid.append(FLOOR)
  43.     # Bottom row
  44.     working_grid.extend(FLOOR * stride) # Bottom row
  45.  
  46.     # Make it a string
  47.     working_grid = ''.join(working_grid)
  48.     next_state = None
  49.  
  50.     while True:
  51.         next_state = compute_next_gen(working_grid, stride)
  52.         if working_grid == next_state:
  53.             break
  54.         working_grid = next_state
  55.  
  56.     steady_state = []
  57.     # Back to the og grid
  58.     for row_span_start in range(stride + 1, len(working_grid) - stride, stride):
  59.         steady_state.extend(working_grid[row_span_start:row_span_start + width])
  60.  
  61.     steady_state = ''.join(steady_state)
  62.     return steady_state
  63.  
  64.  
  65. def main():
  66.     grid = \
  67.           'L.LL.LL.LL' \
  68.         + 'LLLLLLL.LL' \
  69.         + 'L.L.L..L..' \
  70.         + 'LLLL.LL.LL' \
  71.         + 'L.LL.LL.LL' \
  72.         + 'L.LLLLL.LL' \
  73.         + '..L.L.....' \
  74.         + 'LLLLLLLLLL' \
  75.         + 'L.LLLLLL.L' \
  76.         + 'L.LLLLL.LL'
  77.     print(grid)
  78.     width = 10
  79.  
  80.     steady_state = compute_steady_state(grid, width)
  81.     print("Steady state:")
  82.     for span_start in range(0, len(steady_state), width):
  83.         span_end = span_start + width
  84.         print(steady_state[span_start:span_end])
  85.  
  86. if __name__ == '__main__':
  87.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement