Home > Software design >  Is there way to shorten this long if statement code?
Is there way to shorten this long if statement code?

Time:02-22

I have the code like below to return the number that makes the sum of each line the same.

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

The code works fine, but I am looking for ways to shorten the if statement.

My current code only will work result 3*3 because of the specific if statement , I am looking for a better and that will work for all different sizes:

E.g: 4*4, a function produces:

if(
output[0]   output[1]   output[2]  output[3]
output[4]   output[5]   output[6]  output[7]
....
)

I have already had idea or using loop to make randomnumber, but don't know how to make if statement.

Is it possible I could use loop or other methods to create the if statement?

Any suggestions or ideas?

Thank you!

CodePudding user response:

Since you have perfect square matrices, you can use the below logic:

  • Every row needs to have same sum.
  • Every column needs to have same sum.
  • Both diagonals need to have same sum.

So, we add every element of the matrix twice and add diagonal elements one more time. Needlessly to say that the value at the center of the matrix will be added 4 times. We do get a total sum.

We need to compare this sum with the new desired sum derivation in the following way:

desired_sum * (R   C   2)

where R is no. of rows, C is no. of columns and 2 is for the 2 diagonals. Since R = C for your case, it will be

 desired_sum * (N * 2   2)

where N is the no. of rows or columns of the matrix.

Snippet:

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

CodePudding user response:

For the 3x3 problem, you could take the following array of indices and check the sum.

For 4x4 arrays, take another array of indices.

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)) {
    // ...
}
  • Related