Así que me dieron una matriz = [ 1 2 3 8 9 4 7 6 5 ] que es un recorrido en espiral de una matriz cuadrada de tamaño nx n. Lo que tenía que hacer era calcular la suma de las diagonales primaria y secundaria e imprimirla. Pude convertir esta matriz 1D en una matriz 2D de tamaño n*n y calcular la suma de ambas diagonales de esta manera:
pd: la matriz es algo como esto [[1, 2, 3], [6, 5, 8], [7, 4, 9]]
function spDiag(n,arr){ let mat = []; let primary = 0, secondary = 0; while(arr.length) mat.push(arr.splice(0, n)); for(let i = 0; i < n; i++){ for(let j = 0; j < n; j++){ if(i === j) primary += mat[i][j]; if((i + j) === (n-1)) secondary += mat[i][j]; } } console.log(primary + secondary) console.log(JSON.stringify(mat)); } spDiag(3, [1,2,3,8,9,4,7,6,5])Realmente no necesita convertir la matriz 1D en una matriz 2D, ni necesita visitar cada valor en la matriz. Las diagonales siguen un patrón sencillo, ya que la distancia índice entre 2 elementos consecutivos en una diagonal sigue un patrón.
Véase, por ejemplo, para una matriz de 7x7 cuyos índices de la secuencia espiral están en una diagonal:
0 . . . . . 6 . 24 . . . 28 . . . 40 . 42 . . . . . 48 . . . . . 46 . 44 . . . 36 . . . 32 . 18 . . . . . 12Los espacios entre dos índices consecutivos que están en la diagonal (en orden de índice) son: 6, 6, 6, 6, 4, 4, 4, 4, 2, 2, 2, 2. El patrón general para estos espacios es : 𝑛−1,𝑛−1,𝑛−1,𝑛−1,𝑛−3,𝑛−3,𝑛−3,𝑛−3,...etc.
Como el tamaño de la matriz dada es el cuadrado de 𝑛, no veo por qué tendrías que pasar 𝑛 como argumento. Es información redundante.
Asi que:
function sumDiagonals(arr) { let n = Math.sqrt(arr.length); if (n % 1) throw "Array size should be perfect square"; let sum = 0; let len = n*2 - n%2; // The number of values on diagonals for (let i = 0, j = 0; j < len; i += n - 1 - (j++ >> 2)*2) { sum += arr[i]; } return sum; } let arr = [1, 2, 3, 8, 9, 4, 7, 6, 5]; console.log(sumDiagonals(arr));