Padrões 2D Comuns
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 13 de 56.
Algumas operações com arrays 2D aparecem com tanta frequência que vale a pena reconhecê-las pelo nome.
Somar todas as células: achate a grade em um array 1D e chame sum:
grid = [[1, 2], [3, 4]]
puts grid.flatten.sum # 10Diagonal principal: as células onde 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: O Ruby tem isso nativo. Linhas tornam-se colunas e vice-versa:
matrix.transpose
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]Conhecer estes pelo nome evita que você reescreva os mesmos loops aninhados.
Desafio
FácilA matrix quadrada é fornecida (n × n). Imprima três linhas, todas derivadas dos padrões 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, 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: falseFolha de consulta
Operações comuns com arrays 2D em Ruby:
Somar todas as células — achatar (flatten) e depois somar:
grid.flatten.sumDiagonal principal — células onde o índice da linha é igual ao índice da coluna (matrix[i][i]):
(0...matrix.length).each { |i| puts matrix[i][i] }
# i == 0: matrix[0][0], i == 1: matrix[1][1], ...Anti-diagonal — células onde r + c == matrix.length - 1:
(0...matrix.length).each { |i| puts matrix[i][matrix.length - 1 - i] }Transpor — linhas tornam-se colunas:
matrix.transpose
# [[1,4,7],[2,5,8],[3,6,9]]Soma das colunas — transpor primeiro, depois somar cada linha:
matrix.transpose.map(&:sum) # [col0_sum, col1_sum, ...]Verificar simetria — comparar a matriz com sua transposta:
matrix == matrix.transpose # true or falseExperimente você mesmo
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# TODO: soma da antidiagonal, somas das colunas via transposição, verificação de simetria
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 a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em 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 / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline3Arrays 2D
Fundamentos de Arrays 2DAcessando Elementos 2DIterando sobre Arrays 2DPadrões 2D ComunsRecapitulação - Operações com Matrizes6Projeto - Gerenciador de Biblioteca
Visão Geral do ProjetoAdicionar Livro