'use strict'; const arrayEqual = require('../../../utils/arrayEqual'); /** * * @param {string[][]} areas * @param {string} name * @returns {boolean} */ function isContiguousAndRectangular(areas, name) { const indicesByRow = areas.map((row) => { const indices = []; let idx = row.indexOf(name); while (idx !== -1) { indices.push(idx); idx = row.indexOf(name, idx + 1); } return indices; }); for (let i = 0; i < indicesByRow.length; i++) { for (let j = i + 1; j < indicesByRow.length; j++) { const x = indicesByRow[i]; const y = indicesByRow[j]; if ((x && x.length === 0) || (y && y.length === 0)) { continue; } if (!arrayEqual(x, y)) { return false; } } } return true; } /** * * @param {string[][]} areas * @returns {string[]} */ function namedAreas(areas) { const names = new Set(areas.flat()); names.delete('.'); return [...names]; } /** * * @param {string[][]} areas * @returns {string[]} */ function findNotContiguousOrRectangular(areas) { return namedAreas(areas).filter((name) => !isContiguousAndRectangular(areas, name)); } module.exports = findNotContiguousOrRectangular;