const initialBoard = [ [0, 1, 0], [0, 0, 1], [1, 1, 1], [0, 0, 0], ]; const getNextState = (board) => { const rows = board.length; const cols = board[0].length; const countLiveNeighbors = (board, x, y) => { return [-1, 0, 1].reduce( (acc, dx) => acc + [-1, 0, 1].reduce((acc, dy) => (dx === 0 && dy === 0) || x + dx < 0 || y + dy < 0 || x + dx >= rows || y + dy >= cols ? acc : acc + board[x + dx][y + dy], 0), 0, ); }; return board.map((row, x) => row.map((cell, y) => { const liveNeighbors = countLiveNeighbors(board, x, y); return (cell === 1 && (liveNeighbors === 2 || liveNeighbors === 3)) || (cell === 0 && liveNeighbors === 3) ? 1 : 0; }) ); }; const printBoard = (board) => { console.clear(); console.log(board.map((row) => row.join(" ")).join("\n")); }; const runGame = async (initialBoard, generations) => { let board = initialBoard; for (let i = 0; i < generations; i++) { printBoard(board); board = getNextState(board); await new Promise((resolve) => setTimeout(resolve, 500)); // wait before printing the next step. } }; runGame(initialBoard, 100);