Tengo el siguiente código para devolver el número que hace que la suma de cada línea sea la misma.
let getnums = () => { var numsarray = []; var arrays = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var len = arrays.length; while (len > 0) { var rans = Math.floor(Math.random() * len); numsarray.push(arrays[rans]); arrays.splice(rans, 1); len = len - 1; } return numsarray; }; let done = false function test(num){ while (!done) { let output = getnums(); if ( output[0] + output[1] + output[2] == 15 && output[1] + output[4] + output[7] == 15 && output[2] + output[5] + output[8] == 15 && output[0] + output[3] + output[6] == 15 && output[2] + output[4] + output[6] == 15 && output[3] + output[4] + output[5] == 15 && output[6] + output[7] + output[8] == 15 && output[0] + output[4] + output[8] == 15 ) { done = true console.log(output) } } } test()El código funciona bien, pero estoy buscando formas de acortar la declaración if.
Mi código actual solo funcionará con el resultado 3*3 debido a la declaración if específica, estoy buscando una mejor y que funcione para todos los tamaños diferentes:
Por ejemplo: 4*4, una función produce:
if( output[0] + output[1] + output[2] +output[3] output[4] + output[5] + output[6] +output[7] .... )Ya he tenido una idea o he usado el bucle para hacer un número aleatorio, pero no sé cómo hacer una declaración if.
¿Es posible que pueda usar un bucle u otros métodos para crear la declaración if?
¿Alguna sugerencia o idea?
¡Gracias!
Como tiene matrices cuadradas perfectas, puede usar la siguiente lógica:
Entonces, sumamos cada elemento de la matriz dos veces y sumamos los elementos diagonales una vez más. No hace falta decir que el valor en el centro de la matriz se sumará 4 veces. Obtenemos una suma total.
Necesitamos comparar esta suma con la nueva derivación de la suma deseada de la siguiente manera:
desired_sum * (R + C + 2) donde R es no. de filas, C es no. de columnas y 2 es para las 2 diagonales. Dado que R = C para su caso, será
desired_sum * (N * 2 + 2) donde N es el n. filas o columnas de la matriz.
Retazo:
var mat = [ [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1] ]; function test(mat, N, desired_sum){ let sum = 0; let d1_col = 0,d2_col = N - 1; for(let i = 0; i < N; ++i, d1_col++, d2_col--){ for(let j = 0; j < N; ++j){ sum += 2 * mat[i][j]; if(d1_col == j) sum += mat[i][j]; if(d2_col == j) sum += mat[i][j]; } } return sum == desired_sum * (N * 2 + 2); } console.log(test(mat, mat.length, 4));Para el problema de 3x3, puede tomar la siguiente matriz de índices y verificar la suma.
Para arreglos de 4x4, tome otro arreglo de índices.
const getSum = indices => indices.reduce((sum, index) => sum + output[index], 0), indices3 = [[0, 1, 2], [1, 4, 7], [2, 5, 8], [0, 3, 6], [2, 4, 6], [3, 4, 5], [6, 7, 8], [0, 4, 8]]; if (indices3.every(indices => getSum(indices) === 15)) { // ... }