Распространенные 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]]Знание их по именам избавляет вас от повторного написания одних и тех же вложенных циклов.
Задание
ЛегкоДана квадратная matrix (n × n). Выведите три строки, полученные на основе паттернов из теории:
Anti-diagonal sum: <n>, сумма ячеек, гдеr + c == matrix.length - 1Column sums: [...], сумма каждого столбца. Подсказка: сначала выполните транспонирование, затем преобразуйте каждую строку в её сумму, а затем используйтеinspectSymmetric: 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: сумма по побочной диагонали, суммы столбцов через транспонирование, проверка на симметричность
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор7Хеши. Часть 2
Hash.new со значениями по умолчаниюИтерация по хешамВложенные хешиСлияние и преобразованиеИтоги — счетчик частоты10Проект — Учёт студентов
Обзор проектаДобавить студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика по диапазонам5Мощь Enumerable
Select и RejectЦепочки MapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byИтоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваИтерация по двумерным массивамРаспространенные 2D-паттерныИтоги: Операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книги