Menu
Coddy logo textTech

Распространенные 2D-паттерны

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 13 из 56.

Некоторые операции с двумерными массивами встречаются так часто, что их стоит знать по названиям.

Суммировать каждую ячейку: преобразуйте сетку в одномерный массив и вызовите sum:

grid = [[1, 2], [3, 4]]
puts grid.flatten.sum  # 10

Главная диагональ: ячейки, в которых индекс строки равен индексу столбца (matrix[i][i]):

matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

(0...matrix.length).each do |i|
  puts matrix[i][i]
end
# 1, 5, 9

Транспонирование: В Ruby это встроено. Строки становятся столбцами и наоборот:

matrix.transpose
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

Знание их по именам избавляет вас от повторного написания одних и тех же вложенных циклов.

challenge icon

Задание

Легко

Дана квадратная matrix (n × n). Выведите три строки, полученные на основе паттернов из теории:

  1. Anti-diagonal sum: <n>, сумма ячеек, где r + c == matrix.length - 1
  2. Column sums: [...], сумма каждого столбца. Подсказка: сначала выполните транспонирование, затем преобразуйте каждую строку в её сумму, а затем используйте inspect
  3. Symmetric: true или false: равна ли матрица своей транспонированной версии?

Для матрицы по умолчанию вывод будет следующим:

Anti-diagonal sum: 15
Column sums: [12, 15, 18]
Symmetric: false

Шпаргалка

Общие операции с двумерными массивами в Ruby:

Сумма всех ячеек — выравнивание (flatten), затем суммирование:

grid.flatten.sum

Главная диагональ — ячейки, в которых индекс строки равен индексу столбца (matrix[i][i]):

(0...matrix.length).each { |i| puts matrix[i][i] }
# i == 0: matrix[0][0], i == 1: matrix[1][1], ...

Побочная диагональ — ячейки, в которых r + c == matrix.length - 1:

(0...matrix.length).each { |i| puts matrix[i][matrix.length - 1 - i] }

Транспонирование — строки становятся столбцами:

matrix.transpose
# [[1,4,7],[2,5,8],[3,6,9]]

Суммы столбцов — сначала транспонирование, затем суммирование каждой строки:

matrix.transpose.map(&:sum)  # [col0_sum, col1_sum, ...]

Проверка симметрии — сравнение матрицы с её транспонированной версией:

matrix == matrix.transpose  # true или false

Попробуйте сами

matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

# TODO: сумма по побочной диагонали, суммы столбцов через транспонирование, проверка на симметричность
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком