Home > Software engineering >  create triangle numbers pattern javascript and verticaly snake number pattern square
create triangle numbers pattern javascript and verticaly snake number pattern square

Time:09-17

i want create triangle number pattern

let segitigaPola3 = num => {
  let hasil = ''
  for (let i = 1; i <= num; i  ) {
    for(let j = 0; j < i; j  ) {
      hasil  = `${i} `
    }
    
    hasil  = ` \n`
  }
  return hasil
}

console.log(segitigaPola3(5))
console.log()
console.log()

currently output is :

1
2 2
3 3 3
4 4 4 4
5 5 5 5 5

what i want is something like for triangle :

1
2 3
4 5 4
3 2 1 2
3 4 5 4 3

and for square like :

1 10 11 20 21
2 9  12 19 22
3 8  13 18 23
4 7  14 17 24
5 6  15 16 25

how can i achieve like this? thanks for any advice :)

CodePudding user response:

For a triangle pattern u can use @depperm's function. The vertical square snake pattern is a bit trickier:

function triangle(count) {
  var result = "";
  var x = 1;
  var add = true;
  for (var i = 1; i <= count; i  ) {
    for(var j = 0; j < i; j  ) {
      result  = x   " ";
      add ? x  = 1 : x -= 1;
      if(x === count || (x === 1 && !add)) add =! add;
    }
    
    result  = " \n";
  }
  return result;
}


function square(count) {
    var result = "";
    var rows = [];
    for (var i = 0; i < count; i  ) {
        if (i == 0) {
            var row = [0];
            for (var j = 0; j < count; j  ) {
                var num = (j   1) % 2 == 0 ? (j   1) * count : row[j]   1; 
                row.push(num);
            }
            row.shift();
        } else {
            var row = [];
            for (var j = 0; j < count; j  ) {
                var num = (j   1) % 2 == 0 ? (rows[i - 1][j] - 1) : (rows[i - 1][j]   1);
                row.push(num);
            }
        }
        rows.push(row); 
        result  = row.join(" ")   "\n";
    }
    return result;
}

console.log(triangle(5));
console.log(square(5));

CodePudding user response:

For the triangle, this pattern have 4 conditions:

  1. When the number is increasing:

    • If the current number is same as num ==> It's time to turn the flow to decreasing
    • Otherwise, keep it as it is.
  2. When the number is decreasing:

    • If the current number reaches 1 ==> It's time to turn the flow to increasing
    • Otherwise, keep it as it is.

In this code below, I use now and before to track whether the current process/flow is increasing or decreasing, and then check if the current number reaches the turning point (1 or the num variable).

let segitigaPola3 = num => {
  let hasil = ''
  
  let now = 1; // Set arbitrary counter
  let before = 0;
  
  for (let i = 1; i <= num; i  ) {
    for(let j = 0; j < i; j  ) {
      hasil  = `${now} `;
      console.log(now, before, num);
      if (now > before) { // Check if the flow is increasing
        if (now !== num) { // Check for the turning point (num)
          now  ;
          before  ;
        } else {
          now--;
          before  ;
        }
      } else {
        if (now > 1) { // Check if the current still not reached the turning point
          now--;
          before--;
        } else {  // When the current reaches the turning point
          now  ;
          before--;
        }
      }
    }
    
    hasil  = ` \n`
  }
  return hasil
}

console.log(segitigaPola3(5));

For the square, there are 2 conditions for the column-based elements:

  1. For the odd columns, it's always increasing as from the upper row to bottom rows. Here's a highlight to see the pattern:
Row no. | i ( = Col no.) | j
------------------------------
 1      | 1              | 1
 5      | 1              | 5
------------------------------
 1      | 3              | 11
 5      | 3              | 15

This always starts from (i-1)*num 1 and always increases until ends up at (i*num) and we use j to fill the elements.

  1. For the even columns, it's the reverse. Highlight to see the pattern:
Row no. | i ( = Col no.) | j
------------------------------
 1      | 2              | 10
 2      | 2              | 9
------------------------------
 1      | 4              | 20
 2      | 4              | 19

Based on the pattern above, this always starts from i*num and always increases until ends up at (i-1)*num 1 and we use j to fill the elements.

function squareMaker(num) {
  let result = '';
  let arr = [];
  for (let i = 1; i <= num; i  ){
    let temp = [];
    
    // Generating the odd column elements
    if (i % 2 != 0) {
      for (let j = (i-1)*num   1; j <= i*num; j  ) { 
        temp.push(j);
      }
    } 
    
    // Generating the even column elements
    else {
      for (let j = i*num; j > (i-1)*num ; j--) {
        temp.push(j);
      }    
    }
    arr.push(temp);
  }
  
  // Generating the result string.
  for (let i = 0; i < num; i  ){
    for (let j = 0; j < num; j  ) {
      result  = `${arr[j][i]} `;
    }
    result  = '\n';
  }
  return result;
}

console.log(squareMaker(5));

CodePudding user response:

For the triangle, I'd create a separate variable for the output number (x) and a flag for if it should add or subtract.

let segitigaPola3 = num => {
  let hasil = ''
  let x=1;
  let add=true;
  for (let i = 1; i <= num; i  ) {
    for(let j = 0; j < i; j  ) {
      hasil  = `${x} `
      add?x =1:x-=1;
      if(x===num || (x===1 && !add)) add=!add
    }
    
    hasil  = ` \n`
  }
  return hasil
}

console.log(segitigaPola3(5))

  • Related