values=[
[0, 0, 0],
[0, 0, 0],
[1, 1, 1],
];
consecutiveValues(values, 3); // true
values=[
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
];
consecutiveValues(values, 3); // true
values=[
[0, 1, 0],
[0, 1, 0],
[0, 1, 0],
];
consecutiveValues(values, 3); // true
values=[
[0, 1, 0],
[0, 0, 0],
[0, 1, 0],
];
consecutiveValues(values, 3); // false
values=[
[0, 0, 1],
[0, 1, 0],
[1, 0, 0],
];
consecutiveValues(values, 3); // true
values=[
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
];
consecutiveValues(values, 4); // true
consecutiveValues(values, 5); // true
consecutiveValues(values, 6); // false
values=[
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[1, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
];
consecutiveValues(values, 5); // true
consecutiveValues(values, 6); // false
/**
* Función que busca unos (1) consecutivos en un array bidimensional
* @param {array} arr
* @param {integer} len - numero de elementos consecutivos a encontrar
*/
function consecutiveValues(arr, len) {
const lenH=arr[0].length;
// convertimos el array bidimensional en un solo array
arr=arr.reduce((acum, el) => [...acum, ...el], []);
// recorremos todos los elementos del array
for (let i=0; i<arr.length; i++) {
if (arr[i]!=1) {
continue;
}
if (
findNext(arr, len, i, i+len, 1) || // position: -
findNext(arr, len, i, i+(len*lenH), lenH) || // position: |
findNext(arr, len, i, i+(len*lenH), lenH-1) || // position: /
findNext(arr, len, i, i+(len*lenH)+1, lenH+1) // position: \
) {
return true;
}
}
return false;
}
/**
* Función que recorre el array entre dos puntos buscando si en todos
* ellos hay un uno (1)
*
* @param {array} arr
* @param {integer} len - cantidad total de unos (1) a encontrar consecutivos
* @param {integer} start - inicio del array a recorrer
* @param {integer} end - fin del array a recorrer
* @param {integer} steep - salto entre elementos (step)
*
* @return {boolean}
*/
function findNext(arr, len, start, end, steep) {
let total=0;
for (let i=start; i<end; i+=steep) {
if (arr[i]==1) {
if (++total==len) {
return true;
}
} else {
total=0;
}
}
return false;
}
Comentarios sobre la versión: 1 (0)
No hay comentarios