1
/**
2
* @param {number[]} cells
3
* @param {number} n
4
* @return {number[]}
5
*/
6

7
var prisonAfterNDays = function (cells, n) {
8
const set = new Set();
9
let cycleDuration = 0;
10

11
while (n--) {
12
const nextCells = getNextCells(cells);
13

14
// 1. Get cycle length
15
if (!set.has(String(nextCells))) {
16
set.add(String(nextCells));
17
cycleDuration++;
18
cells = nextCells;
19
} else {
20
// 2. Use cycle length to iterate once more to get to correct order
21
let remainderToMove = n % cycleDuration;
22
while (remainderToMove >= 0) {
23
remainderToMove--;
24
cells = getNextCells(cells);
25
}
26
break;
27
}
28
}
29

30
return cells;
31
};
32

33
function getNextCells(cells) {
34
let temp = [...cells];
35
for (let i = 0; i < 8; i++) {
36
if (i > 0 && i < 7 && cells[i - 1] === cells[i + 1]) {
37
temp[i] = 1;
38
} else {
39
temp[i] = 0;
40
}
41
}
42

43
return temp;
44
}
45

46
// 0
47
// 1
48
// 2
49
// n
50

51
// 1 000 000 % n

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0