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, 5)