65 lines
1.1 KiB
JavaScript
65 lines
1.1 KiB
JavaScript
'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;
|