Answer

Answer

t.me/js_test

Ответ:

function triangle(size, direction) {
  const rowSize = ["top", "bottom"].includes(direction) ? size : size + 2;
  const colSize = ["right", "left"].includes(direction) ? size : size + 2;

  const result = Array.from({ length: rowSize }, () =>
    Array.from({ length: colSize }, () => " ")
  );

  for (let i = 0; i < size; i++) {
    const symbolsCount = size + 2 - i * 2;

    for (let j = 0; j < size + 2; j++) {
      if (i > j || j - i >= symbolsCount) {
        continue;
      }

      switch (direction) {
        case "top":
          result[size - i - 1][j] = "*";
          break;
        case "bottom":
          result[i][j] = "*";
          break;
        case "right":
          result[j][i] = "*";
          break;
        case "left":
          result[j][size - i - 1] = "*";
          break;
      }
    }
  }

  return result.map((r) => r.join("")).join("\n");
}

Объяснение:

Основание нашего треугольника всегда на две клетки больше чем его высота, поэтому мы определяем две переменные rowSize и colSize для того чтобы с помощью метода Array.from создать матрицу правильного размера. Далее создаём два цикла, считаем количество звёзд которые должны быть вставлены в матрицу на каждом шаге (symbolsCount), с помощью такой проверки (i > j || j - i >= symbolsCount) пропускаем места где звёзд быть не должно. Затем с помощью оператора switсh вставляем звёзды в нужные места в зависимости от направление треугольника. В самом конце соединяем всё в одну строку и возвращаем.

Код для проверки:

function triangle(size, direction) {
  const rowSize = ["top", "bottom"].includes(direction) ? size : size + 2;
  const colSize = ["right", "left"].includes(direction) ? size : size + 2;

  const result = Array.from({ length: rowSize }, () =>
    Array.from({ length: colSize }, () => " ")
  );

  for (let i = 0; i < size; i++) {
    const symbolsCount = size + 2 - i * 2;

    for (let j = 0; j < size + 2; j++) {
      if (i > j || j - i >= symbolsCount) {
        continue;
      }

      switch (direction) {
        case "top":
          result[size - i - 1][j] = "*";
          break;
        case "bottom":
          result[i][j] = "*";
          break;
        case "right":
          result[j][i] = "*";
          break;
        case "left":
          result[j][size - i - 1] = "*";
          break;
      }
    }
  }

  return result.map((r) => r.join("")).join("\n");
}

console.log(triangle(3, "left"));
/*
   *
  **
 ***
  **
   *
 */
console.log(triangle(5, "bottom"));
/*
 *******
  *****
   ***
    *
 */
console.log(triangle(3, "right"));
/*
 *
 **
 ***
 **
 *
 */
console.log(triangle(5, "top"));
/*
    *
   ***
  *****
 *******
 */

Report Page