Dada la matriz de n y values ( values.length = 2 * n - 1 ), quiero llenar una matriz de nxn elementos, de manera que sus diagonales tengan los mismos valores de la siguiente manera:
ex. n = 3, valores = [0, 1, 2, 3, 4]:
0 1 2 3 0 1 4 3 0 arr = [0, 1, 2, 3, 0, 1, 4, 3, 0]ex. n = 4, valores = [0, 1, 2, 3, 4, 5, 6];
0 1 2 3 4 0 1 2 5 4 0 1 6 5 4 0 arr = [0, 1, 2, 3, 4, 0, 1, 2, 5, 4, 0, 1, 6, 5, 4, 0]Pude llenar la mitad superior de la matriz usando el siguiente código, pero me quedé atascado con el resto:
var n = 3; var values = [0, 1, 2, 3, 4] var a = []; for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { a[j * n + i] = values[i - j]; } } /* Result 0 1 2 0 1 0 arr = [0, 1, 2, undefined, 0, 1, undefined, undefined, 0] Expected output: 0 1 2 3 0 1 4 3 0 arr = [0, 1, 2, 3, 0, 1, 4, 3, 0] */ La longitud de la matriz de values es 2 * n - 1 , que es el recuento de las diagonales de la matriz.
¿Alguna idea de cómo llenar toda la matriz?
Creado while loop y agregado contador. El contador cuenta los elementos que se supone que deben cortarse desde el final. El primer ciclo pasa por estos elementos y los agrega al principio, el segundo ciclo está limitado por este contador, por lo que no llega al final de la matriz y agrega los elementos que no se han cortado desde la matriz hasta el final. hasta que todos los elementos se eliminen de la matriz.
var values = [0, 1, 2, 3, 4] var a = []; var ctr = 0 while(ctr < values.length){ for(let i = (values.length - ctr); i < values.length; i++){ a.push(values[i]); } for(let i = 0; i < (values.length - ctr); i++){ a.push(values[i]); } ctr++; }Producción
[0, 1, 2, 3, 4, 4, 0, 1, 2, 3, 3, 4, 0, 1, 2, 2, 3, 4, 0, 1, 1, 2, 3, 4, 0] 0 1 2 3 4 4 0 1 2 3 3 4 0 1 2 2 3 4 0 1 1 2 3 4 0Ok, vi los resultados solicitados e hice este fragmento a continuación. Uso una matriz bidimensional para poder verificar si existe una diagonal existente usando la lógica xy y, si no la hay, había un contador que haría referencia al siguiente número de matriz ( c+1%arr.length )
EDICIÓN EXPLICADA : vi lo que estaba pasando y luego decidí intentar agregar solo cuando no había diagonal en ese "lugar"... funciona de maravilla 👌
var arr=[0,1,2,3,4] function makeBox(arr,n){ var toReturn=[], c=0 for(let i=0;i<n*n;i++){ let y=(i-(i%n))/n, x=i%n let diagonal=toReturn[y-1]?toReturn[y-1][x-1]:undefined let isDiagonal=typeof diagonal==="number" //0 is a number toReturn[y]?toReturn[y].push(isDiagonal?diagonal:arr[c]): toReturn[y]=[isDiagonal?diagonal:arr[c]] if(!isDiagonal){c=(c+1)%arr.length} } return toReturn.map(a=>a.join(' ')).join('\n') } console.log(makeBox(arr,3)) console.log(makeBox(arr,4)) console.log(makeBox(arr,6)) console.log("before you say that it doesn't work.. you just need the correctly sized array\nLook Below") console.log(makeBox([0,1,2,3,4,5,6],4))A continuación se presenta una posible implementación que logra el objetivo deseado:
const values = [0, 1, 2, 3, 4]; const getCustomArray = (n = 3, val = values) => { const res = [...Array(n)].map(x => [...Array(n).fill(-1)]); for (let i = 0; i < n; i++) { res[i][i] = val[0]; for (let j = 1; i + j < n; j++) { res[i][i+j] = val[j]; res[i+j][i] = val[n + j - 1] } } return res.map(r => r.join(' ')).join('\n'); }; console.log('3 x 3 array:\n' + getCustomArray()); console.log('4 x 4 array:\n'+ getCustomArray(4, [...Array(2 * 4 -1).keys()])); console.log('5 x 5 array:\n'+ getCustomArray(5, [...Array(2 * 5 -1).keys()])); console.log('9 x 9 array:\n'+ getCustomArray(9, [...Array(2 * 9 -1).keys()]));Acercarse
n filas y n columnas y se llena con algún valor (como -1 ).i itera sobre el conjunto de diagonales0,0 , 1,1 , 2,2 se establecen en el primer elemento de la matriz de values (normalmente 0 ).j for-loop.res[i][i+j] apunta a las diagonales superiores (como 0,1 , 1,2 , 2,3 , ...) y se completa con una matriz de valuesres[i+j][j] apunta a las diagonales inferiores (como 1,0 , 2,1 , 3,2 , ...) y se completa mediante el uso de un offset de n - 1 para indexar la matriz de valuesAgregue cualquier pregunta o comentario sobre los comentarios.