Проверка части нескольких массивов чисел на наличие чисел от 1 до 9

Дана матрица из целых чисел от 1 до 9, размером 3 * N, где N может быть больше либо равна 3. Необходимо определить содержит ли каждый участок матрицы 3 * 3 все числа от 1 до 9.

let array = [
    [1, 2, 3, 2, 7],
    [4, 5, 6, 8, 1],
    [7, 8, 9, 4, 5]
];

Подскажите как это можно сделать


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

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

Можно попробовать так.

  • Получаем индекс начала последней группы.
  • Проходимся в цикле от 0 до этого индекса.
  • В каждой итерации создаём из полной матрицы её участок из трёх элементов каждого ряда, а потом превращаем этот участок в линейный массив. Обе операции можно сделать сразу при помощи Array.prototype.flatMap().
  • После того, как мы получили массив из 9 цифр, можно схитрить — превратить этот массив в Set. Если количество элементов Set всё ещё будет равным 9, значит все цифры были разные и участок проходит проверку.
  • Если встретили хоть один неправильный участок, сразу возвращаем false. Иначе возвращаем true после цикла.

const array = [
    [1, 2, 3, 2, 7],
    [4, 5, 6, 8, 1],
    [7, 8, 9, 4, 5]
];

function checkMatrix(matrix) {
  const latGroupStart = matrix[0].length - 3;

  for (let i = 0; i <= latGroupStart; i++) {
    const section = matrix.flatMap(row => row.slice(i, i + 3));
    const uniqueDigits = new Set(section);
    if(uniqueDigits.size < 9) return false;
  }

  return true;
}

console.log(checkMatrix(array));

→ Ссылка