Minesweeper

/*
 * Author: IcarusTheFly (https://github.com/IcarusTheFly)
 * Minesweeper explanation can be found in: https://en.wikipedia.org/wiki/Minesweeper_(video_game)
 * This function will take a rectangular matrix filled with boolean values - the value for a cell
 * with a mine will be true, otherwise it will be false.
 * As a result it will return a rectangular matrix where each cell will have an integer that
 * counts all the mines in the adjacent cells
 * Two cells should share at least one corner to be considered adjacent
 */

/**
 * @function minesweeper
 * @description It counts the amount of mines surrounding every cell and returns a formatted matrix
 * @param {boolean[][]} matrix
 * @returns {number[][]} Matrix of numbers with the amount of mines surrounding each cell
 */

export const minesweeper = (matrix) => {
  const arrResult = []
  for (let x = 0; x < matrix.length; x++) {
    const arrLine = []
    for (let y = 0; y < matrix[x].length; y++) {
      let minesInCell = 0
      for (let xi = x - 1; xi <= x + 1; xi++) {
        if (matrix[xi] !== undefined) {
          for (let yi = y - 1; yi <= y + 1; yi++) {
            if ((xi !== x || yi !== y) && matrix[xi][yi] === true) {
              minesInCell++
            }
          }
        }
      }
      arrLine.push(minesInCell)
    }
    arrResult.push(arrLine)
  }
  return arrResult
}