Паттерны и алгоритмы для работы с двумерными циклами

Рассмотрим различные варианты манипуляции с двумерными циклами. Полученные знания в дальнейшем пригодятся для решения различных типов задач, например обход двухмерной матрицы и прочее.

Оглавление статьи

  1. Вводная часть
  2. Паттерн 1 (простой квадрат)
  3. Паттерн 2 (лесенка вправо)
  4. Паттерн 3 (лесенка влево)
  5. Паттерн 4 (перевернутая лесенка вправо)
  6. Паттерн 5 (перевернутая лесенка влево)
  7. Паттерн 6 (числовая лесенка вправо)
  8. Паттерн 7 (числовая лесенка влево)
  9. Паттерн 8 (перевернутая числовая лесенка вправо)
  10. Паттерн 9 (перевернутая числовая лесенка влево)
  11. Паттерн 10 (числовая лесенка вправо 2)
  12. Паттерн 11 (треугольник)
  13. Паттерн 12 (перевернутый треугольник)
  14. Паттерн 13 (почти ромб)
  15. Паттерн 14 (стрелка вправо)
  16. Паттерн 15 (бинарная лесенка вправо)
  17. Паттерн 16 (зеркальные числовые лесенки)
  18. Паттерн 17 (числовая лесенка вправо 3)
  19. Паттерн 18 (буквенная лесенка вправо)
  20. Паттерн 19 (перевернутая буквенная лесенка вправо)
  21. Паттерн 20 (буквенная лесенка вправо 2)
  22. Паттерн 21 (буквенный треугольник)
  23. Паттерн 22 (буквенная лесенка вправо 3)
  24. Паттерн 23 (внутренний ромб)
  25. Паттерн 24 (бабочка)
  26. Паттерн 25 (прозрачный квадрат)
  27. Паттерн 26 (матрица убывающих чисел)

Вводная часть

У двумерного цикла имеется внешний циклы и внутренний цикл. Внешний цикл отвечает за строки, а внутренний цикл отвечает за столбцы.

    с т о л б цы
с   * * * * * *
т   * * * * * *
р   * * * * * *
о   * * * * * *
ки  * * * * * *

Этапы оценки шаблона

  1. Для внешнего цикла посчитать количество строк
  2. Для внутреннего цикла посчитать количество столбцов и определенным образом соединить их со строками
  3. Выводить данные во внутреннем цикле
  4. Соблюдать симметрию при необходимости
JS
// 1.
// внешний цикл обрабатывает строки
// каждая итерация внешнего цикла ждет полного завершения внутреннего цикла
// и только после этого переходит к следующей итерации строки
for (let i = 0; i < n; i++) {

  // 2.
  // внутренний цикл обрабатывает столбцы один за другим пока число столбцов не будет
  // соответствовать условию завершения внутреннего цикла
  for (let j = 0; j < n; j++) {

    // 3.
    // Вывод данных
  }

  // 4.
  // итерация внешнего цикла завершилась
  // переводим каретку (курсор) на новую строку и повторяем одну строку за другой
  // пока число строк не будет соотвествовать условию завершения внешнего цикла
}

Паттерн первый (простой квадрат)

******
******
******
******
******
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

    for (let j = 0; j < n; j++) {
      result += '*'
    }

    result += '\n'
  }

  return result
}

Паттерн второй (лесенка вправо)

*
**
***
****
*****
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 0; j <= i; j++) {
        result += '*'
      }

      result += '\n'
  }

  return result
}

Паттерн третий (лесенка влево)

    *
   **
  ***
 ****
*****
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 0; j <= n; j++) {
        if (j > n - i - 1) {
          result += '*'
        } else {
          result += ' '
        }
      }

      result += '\n'
  }

  return result
}

Паттерн четвертый (перевернутая лесенка вправо)

*****
****
***
**
*
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 0; j < n - i; j++) {
        result += '*'
      }

      result += '\n'
  }

  return result
}

Паттерн пять (перевернутая лесенка влево)

*****
 ****
  ***
   **
    *
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 0; j < n; j++) {
        if (j >= i) {
          result += '*'
        } else {
          result += ' '
        }
      }

      result += '\n'
  }

  return result
}

Паттерн шесть (числовая лесенка вправо)

12345
1234
123
12
1
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 1; j <= n - i; j++) {
        result += `${j}`
      }

      result += '\n'
  }

  return result
}

Паттерн семь (числовая лесенка влево)

12345
 1234
  123
   12
    1
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 1; j <= n; j++) {
        if (j >= n - (n - i - 1)) {
          result += `${j - i}`
        } else {
          result += ` `
        }
      }

      result += '\n'
  }

  return result
}

Паттерн восемь (перевернутая числовая лесенка вправо)

1
12
123
1234
12345
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 1; j <= i + 1; j++) {
        result += `${j}`
      }

      result += '\n'
  }

  return result
}

Паттерн девять (перевернутая числовая лесенка влево)

    1
   12
  123
 1234
12345
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

      for (let j = 1; j <= n; j++) {
        if (j > n - i - 1) {
          result += `${j - (n - i - 1)}`
        } else {
          result += ' '
        }
      }

      result += '\n'
  }

  return result
}

Паттерн десять (числовая лесенка вправо 2)

1
22
333
4444
55555
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 1; i <= n; i++) {

        for (let j = 0; j < i; j++) {
          result += `${i}`
        }

        result += '\n'
  }

  return result
}

Паттерн одиннадцать (треугольник)

    *
   ***
  *****
 *******
*********
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

        for (let j = 0; j < n * 2 - 1; j++) {
          if (j >= n - i - 1 && j <= n + i - 1) {
            result += '*'
          } else {
            result += ' '
          }
        }

        result += '\n'
  }

  return result
}

Паттерн двенадцать (перевернутый треугольник)

*********
 *******
  *****
   ***
    *
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

        for (let j = 0; j < n * 2 - 1; j++) {
          if (j >= i && j < n * 2 - 1 - i) {
            result += '*'
          } else {
            result += ' '
          }
        }

        result += '\n'
  }

  return result
}

Паттерн тринадцать (почти ромб)

    *
   ***
  *****
 *******
*********
*********
 *******
  *****
   ***
    *
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {

        for (let j = 0; j < n * 2 - 1; j++) {
          if (j >= n - i - 1 && j <= n + i - 1) {
            result += '*'
          } else {
            result += ' '
          }
        }

        result += '\n'
  }

  for (let i = 0; i < n; i++) {

        for (let j = 0; j < n * 2 - 1; j++) {
          if (j >= i && j < n * 2 - 1 - i) {
            result += '*'
          } else {
            result += ' '
          }
        }

        result += '\n'
  }

  return result
}

Паттерн четырнадцать (стрелка вправо)

*
**
***
****
*****
****
***
**
*
JS
console.log(pattern(5))

function pattern(n) {
  let result = ''

  for (let i = 0; i < n * 2; i++) {
      let col = i

      if (i >= n) col = n * 2 - i

      for (let j = 0; j < col; j++) {
        result += '*'
      }

      result += '\n'
  }

  return result
}

Паттерн пятнадцать (бинарная лесенка вправо)

1
0 1
1 0 1
0 1 0 1
1 0 1 0 1
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {
      let start = 0

      if (i % 2 === 0 ) start = 1

      for (let j = 0; j <= i; j++) {
        result += `${start}`
        start = 1 - start
      }

      result += '\n'
  }

  return result
}

Паттерн шестнадцать (зеркальные числовые лесенки)

1      1
12    21
123  321
12344321
JS
console.log(pattern(4))

function pattern(n) {
  let result = '\n'

  let space = 2 * (n - 1)

  for (let i = 1; i <= n; i++) {

      for (let j = 1; j < i + 1; j++) {
        result += `${j}`
      }

      for (let j = 0; j < space; j++) {
        result += ' '
      }

      for (let j = i; j > 0; j--) {
        result += `${j}`
      }

      space -= 2
      result += '\n'
  }

  return result
}

Паттерн семнадцать (числовая лесенка вправо 3)

1
2 3
4 5 6
7 8 9 10
11 12 13 14 15

Вариант 1

JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let start = 1

  for (let i = 1; i <= n; i++) {

      for (let j = 0; j < i; j++) {
        result += `${j + start} `
      }

      start += i
      result += '\n'
  }

  return result
}

Вариант 2

JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let start = 1

  for (let i = 0; i < n; i++) {

    for (let j = 0; j <= i; j++) {
      result += `${start} `
      start += 1
    }

    result += '\n'
  }

  return result
}

Паттерн восемнадцать (буквенная лесенка вправо)

A
AB
ABC
ABCD
ABCDE
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let start = 'A'.charCodeAt()

  for (let i = 0; i < n; i++) {

    for (let j = start; j <= start + i; j++) {
      result += String.fromCharCode(j)
    }

    result += '\n'
  }

  return result
}

Паттерн девятнадцать (перевернутая буквенная лесенка вправо)

ABCDE
ABCD
ABC
AB
A
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let start = 'A'.charCodeAt()

  for (let i = n; i > 0; i--) {

    for (let j = start; j < start + i; j++) {
      result += String.fromCharCode(j)
    }

    result += '\n'
  }

  return result
}

Паттерн двадцать (буквенная лесенка вправо 2)

A
BB
CCC
DDDD
EEEEE
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let start = 'A'.charCodeAt()

  for (let i = 0; i < n; i++) {

    for (let j = 0; j <= i; j++) {
      result += String.fromCharCode(start + i)
    }

    result += '\n'
  }

  return result
}

Паттерн двадцать один (буквенный треугольник)

    A
   ABA
  ABCBA
 ABCDCBA
ABCDEDCBA
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for (let i = 0; i < n; i++) {
    for(let j = 0; j < n - i - 1; j++){
      result += ' '
    }

    let ch = 'A'.charCodeAt()
    let breakpoint = (2 * i + 1) / 2

    for(let j = 1; j <= 2 * i + 1; j++) {
      result += String.fromCharCode(ch)

      if (j <= breakpoint) ch++
      else ch--
    }

    for (let j = 0; j < n - i - 1; j++) {
      result += ' '
    }

    result += '\n'
  }

  return result
}

Паттерн двадцать два (буквенная лесенка вправо 3)

E
D E
C D E
B C D E
A B C D E
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let ch = 'E'.charCodeAt()

  for (let i = 0; i < n; i++) {
    for (let j = ch - i; j <= ch; j++) {
      result += String.fromCharCode(j) + ' '
    }

    result += '\n'
  }

  return result
}

Паттерн двадцать три (внутренний ромб)

**********
****  ****
***    ***
**      **
*        *
*        *
**      **
***    ***
****  ****
**********
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let space = 0

  for (let i = 0; i < n; i++) {
    for (let j = 1; j <= n - i; j++) {
      result += '*'
    }

    for (let j = 0; j < space; j++) {
      result += ' '
    }

    for (let j = 1; j <= n - i; j++) {
      result += '*'
    }

    result += '\n'
    space += 2
  }

  space = n * 2 - 2

  for (let i = 1; i <= n; i++) {
    for (let j = 1; j <= i; j++) {
      result += '*'
    }

    for (let j = 0; j < space; j++) {
      result += ' '
    }

    for (let j = 1; j <= i; j++) {
      result += '*'
    }

    result += '\n'
    space -= 2
  }

  return result
}

Паттерн двадцать четыре (бабочка)

*        *
**      **
***    ***
****  ****
**********
****  ****
***    ***
**      **
*        *
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  let space = n * 2 - 2

  for (let i = 1; i <= n * 2 - 1; i++) {
    let stars = i

    if (i > n) stars = n * 2 - i

    for (let j = 1; j <= stars; j++) {
      result += '*'
    }

    for (let j = 1; j <= space; j++) {
      result += ' '
    }

    for (let j = 1; j <= stars; j++) {
      result += '*'
    }

    if (i < n) space -= 2
    else space += 2

    result += '\n'
  }

  return result
}

Паттерн двадцать пять (прозрачный квадрат)

******
*    *
*    *
*    *
*    *
******
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for(let i = 0; i < n; i++) {

    for(let j = 0; j < n; j++) {
      if(i === 0 || j === 0 || i === n - 1 || j === n - 1) {
        result += "*"
      } else {
        result += " "
      }
    }

    result += '\n'

  }

  return result
}

Паттерн двадцать шесть (матрица убывающих чисел)

5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5
JS
console.log(pattern(5))

function pattern(n) {
  let result = '\n'

  for(let i = 0; i < n * 2 - 1; i++) {

    for(let j = 0; j < n * 2 - 1; j++) {
      let top = i
      let left = j
      let bottom = (n * 2 - 2) - i
      let right = (n * 2 - 2) - j

      result += (n - Math.min(Math.min(top, bottom), Math.min(left, right))) + ' '
    }

    result += '\n'

  }

  return result
}
Предыдущая статья Стартовый Jekyll шаблон для создания статических сайтов Следующая статья Математические манипуляции с числами