Padrões comuns em 2D
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy. Lição 13 de 56.
Algumas operações em arrays 2D aparecem com tanta frequência que vale a pena reconhecê-las pelo nome.
Some cada célula: aplique flatten à grade para transformá-la em um array 1D e chame sum:
grid = [[1, 2], [3, 4]]
puts grid.flatten.sum # 10Diagonal principal: as células em que o índice da linha é igual ao índice da coluna (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, 9Transposição: Ruby tem isso integrado. As linhas se tornam colunas e vice-versa:
matrix.transpose
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]Conhecer esses pelo nome evita que você tenha que reescrever os mesmos loops aninhados.
Desafio
FácilA matrix quadrada é fornecida (n × n). Imprima três linhas, todas derivadas dos padrões apresentados na teoria:
Anti-diagonal sum: <n>, a soma das células onder + c == matrix.length - 1Column sums: [...], a soma de cada coluna. Dica: faça a transposição primeiro, depois mapeie cada linha para sua soma e, então, useinspectSymmetric: trueoufalse: a matriz é igual à sua própria transposta?
Para a matriz padrão, a saída é:
Anti-diagonal sum: 15
Column sums: [12, 15, 18]
Symmetric: falseExperimente você mesmo
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# TODO: anti-diagonal sum, column sums via transpose, symmetric check
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings em Profundidade
Visão Geral dos Métodos de StringInterpolação de StringsPercorrendo StringsDividir e UnirRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA Palavra-chave yieldParâmetros de BlocoProcs e LambdasRevisão - Iterador Personalizado7Hashes - Parte 2
Hash.new com Valores PadrãoIterando sobre HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um intervalo?Métodos de intervaloIntervalos em Case / WhenRevisão - Prática com intervalos5Potência do Enumerable
Select e RejectEncadeando MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Pipeline de Dados3Arrays 2D
Fundamentos de Arrays 2DAcessando elementos 2DPercorrendo Arrays 2DPadrões comuns em 2DRecapitulação - Operações com matrizes6Projeto - Gerenciador de Biblioteca
Visão Geral do ProjetoAdicionar LivroPratique por conta própria: Compilador de Ruby online