Распространенные 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Попробуйте сами
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Проект — Менеджер библиотеки
Обзор проектаДобавление книги