创建三角形数字模式 javascript 和垂直蛇数字模式正方形

create triangle numbers pattern javascript and verticaly snake number pattern square

我想创建三角形数字图案

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

当前输出为:

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

我想要的是类似 对于三角形:

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

和正方形像:

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

我怎样才能达到这样的效果? 感谢您的任何建议:)

对于三角形,我会为输出数字 (x) 创建一个单独的变量,并为它是否应该加或减创建一个标志。

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

对于三角形,这个形态有4个条件:

  1. 数字递增时:

    • 如果当前数与num相同 ==> 是时候将流量转为递减了
    • 否则,保持原样。
  2. 数字递减时:

    • 如果当前数量达到1 ==> 是时候将流量转为增加了
    • 否则,保持原样。

在下面的这段代码中,我使用nowbefore来跟踪当前process/flow是增加还是减少,然后检查当前数字是否到达转折点( 1 或 num 变量)。

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

对于正方形,基于列的元素有2个条件:

  1. 对于奇数列,它总是从上行到下行递增。这是查看模式的亮点:
Row no. | i ( = Col no.) | j
------------------------------
 1      | 1              | 1
 5      | 1              | 5
------------------------------
 1      | 3              | 11
 5      | 3              | 15

这总是从 (i-1)*num + 1 开始,一直增加到 (i*num) 结束,我们使用 j 来填充元素。

  1. 偶数列则相反。突出显示模式:
Row no. | i ( = Col no.) | j
------------------------------
 1      | 2              | 10
 2      | 2              | 9
------------------------------
 1      | 4              | 20
 2      | 4              | 19

根据上面的模式,这总是从 i*num 开始,一直增加到 (i-1)*num + 1 结束,我们使用 j 来填充元素。

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

对于三角形图案,您可以使用@depperm 的函数。垂直方蛇图案有点棘手:

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