Булевая Матрица

Есть булевая матрица элементы, которой являются множеством из true и false. Нужно переоброзавать матрицу в матрицу чисел так, чтобы элемент [i, j] в своих соседних полях показал количество полей, которые имеют значение true.

Например

A = [
        [true, false, false],
        [false, true, false],
        [false, false, false]
    ];

В случае матрицы A, мы получим.

A = [
        [1, 2, 1],
        [2, 1, 1],
        [1, 1, 1]
    ]

Нужно написать функцию который получает булевую матрицу и возвращает переоброзованную матрицу.

function bool(A) {
    A = A.map((col, i) => A.map(row => +row[i]));
    let counter = 0;
    for (let i = 0; i < A.length; i++) {
        for (let j = 0; j < A[i].length; j++) {
            if (A[i][j] == 1) {
                counter++;
            }
            if (A[i][j - 1] == 0 || A[i][j + 1] == 0) {
                A[i][j] = counter;
            }
        }
    }
    return A
}


console.log(bool([[true, false, false],[false, true, false],[false, false, false]]));
// Должен выводится [[1, 2, 1], [2, 1, 1], [1, 1, 1]]
console.log(bool([[false, false, false],[false, false, false]]));
// Должен выводится [[0, 0, 0], [0, 0, 0]])
console.log(bool[[true, false, false, true],[false, false, true, false], [true, true, false, true]]));
// Должен выводится [[0, 2, 2, 1], [3, 4, 3, 3], [1, 2, 3, 1]]
console.log(bool[[true, false, false, true],[false, true, false, true], [false, false, false, true]]));
// Должен выводится [[1, 2, 3, 1], [2, 1, 4, 2], [1, 1, 3, 1]]

Помогите пожулйста верно втсавить условия и решить задачу...


Ответы (2 шт):

Автор решения: Igor

var A = [
  [true, false, false],
  [false, true, false],
  [false, false, false]
];
/*[  [1, 2, 1],
     [2, 1, 1],
     [1, 1, 1]  ]*/
    
function bool(A) {
  let res = [];
  for (let i = 0; i < A.length; i++) {
    res.push([]);
    for (let j = 0; j < A[i].length; j++) {

      // check 8 entries of the 3x3 matrix around the current element A[i][j]
      let v = 0;
      for (let i1 = i - 1; i1 <= i + 1; i1++)
        for (let j1 = j - 1; j1 <= j + 1; j1++)
          if ((i1 != i || j1 != j) && A[i1] && A[i1][j1])
            v++;
      res[res.length - 1].push(v);

    }
  }
  return res;
}

console.log(bool(A));

→ Ссылка
Автор решения: Stranger in the Q

У меня вот что получилось:

let bool = [
  [true, false, false],
  [false, true, false],
  [false, false, false]
];

let kernel = [0,1,2,3,5,6,7,8];

let calc = (x, y, i) => {
  let row = bool[y + parseInt(i / 3) - 1];
  return row && row[x + i % 3 - 1];
};

let result = bool.map((row,y) => row.map((_,x) =>
    kernel.map(i => calc(x,y,i))
          .reduce((a,v) => (v||0)+a,0)));

console.log(JSON.stringify(result))

→ Ссылка