Tengo una matriz de matrices que se ve así:
var grid = [ [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0] ];Quiero contar el número de 1 seguidos hasta llegar a un cero. Y luego, si llegamos a un 1 nuevamente, contamos las ocurrencias secuenciales nuevamente.
So for grid[0], it should return 9. For grid[1], it should return [3,3]. grid[2], [2,1,1,2].Como una capa adicional de diversión, también intento hacer esto para las "columnas". Es decir, cuántas veces aparece "1" en la primera columna, que consistiría en grid[0][1], grid[1][1], grid[2][1] y así sucesivamente. Si hay una mejor manera de organizar los datos para lograr esto, estoy abierto a sugerencias ya que en total tengo 25 filas/matrices dentro de la matriz.
No estoy seguro de si hay una manera que no implique recorrer los datos una y otra vez. Actualmente estoy haciendo esto:
var guides = []; for ( var i = 0; i < grid.length; i++ ) { var row = grid[i]; var chunks = []; var count = 0; for (var j = 0; j < row.length; j++ ) { if ( j === 1 ) { count++; } else { chunks.push(count); count = 0; } } guides.push(chunks); }Aquí hay un ejemplo de cómo puede usar la recursividad para verificar esas huelgas número 1. Para las columnas, puede transponer la Cuadrícula original y reutilizar la misma función.
var grid = [ [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0], ] // Returns the array of 1 strikes in the given arr const occurrenceOfOne = (arr, strike = 0, final = []) => { // Recursive calls until the array is empty if (arr.length === 0) { return strike === 0 ? final : final.concat([strike]) } // If the item is 0, the strike ends. if (arr[0] === 0) { if (strike !== 0) { return occurrenceOfOne(arr.slice(1), 0, final.concat([strike])) } } // If the item is 1, the strike continues if (arr[0] === 1) { return occurrenceOfOne(arr.slice(1), strike + 1, final) } // Default value 0 found and strike is 0 as well. return occurrenceOfOne(arr.slice(1), 0, final) } // Copied transpose function from this gist: // https://gist.github.com/femto113/1784503 function transpose(a) { return a[0].map((_, c) => a.map((r) => r[c])) } console.log(occurrenceOfOne(grid[0])) console.log(occurrenceOfOne(grid[1])) console.log(occurrenceOfOne(grid[2])) const transposedGrid = transpose(grid) console.log(occurrenceOfOne(transposedGrid[6])) console.log(occurrenceOfOne(transposedGrid[7]))