Back to all solutions

#957 - Prison Cells After N Days

Problem Description

There are 8 prison cells in a row and each cell is either occupied or vacant.

Each day, whether the cell is occupied or vacant changes according to the following rules:

  • If a cell has two adjacent neighbors that are both occupied or both vacant, then the cell becomes occupied.
  • Otherwise, it becomes vacant.

Note that because the prison is a row, the first and the last cells in the row can't have two adjacent neighbors.

You are given an integer array cells where cells[i] == 1 if the ith cell is occupied and cells[i] == 0 if the ith cell is vacant, and you are given an integer n.

Return the state of the prison after n days (i.e., n such changes described above).

Solution

/**
 * @param {number[]} cells
 * @param {number} n
 * @return {number[]}
 */
var prisonAfterNDays = function(cells, n) {
  const nextState = cells => [
    0,
    ...Array.from({ length: 6 }, (_, i) => cells[i] === cells[i + 2] ? 1 : 0),
    0
  ];

  let current = [...cells];
  const seen = new Map();
  let cycleLength = 0;

  while (n > 0) {
    const stateKey = current.join('');
    if (seen.has(stateKey)) {
      const cycleStart = seen.get(stateKey);
      cycleLength = cycleStart - n;
      n %= cycleLength;
    }
    seen.set(stateKey, n);
    if (n > 0) {
      current = nextState(current);
      n--;
    }
  }

  return current;
};