Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

170
Vistas
¿Hay alguna forma de acortar este largo código de instrucción if?

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!

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Como tiene matrices cuadradas perfectas, puede usar la siguiente lógica:

  • Cada fila debe tener la misma suma.
  • Cada columna debe tener la misma suma.
  • Ambas diagonales deben tener la misma suma.

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));

about 4 years ago · Juan Pablo Isaza Denunciar

0

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)) { // ... }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda