Menu
Coddy logo textTech

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  # 10

Diagonal 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, 9

Transposiçã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.

challenge icon

Desafio

Fácil

A matrix quadrada é fornecida (n × n). Imprima três linhas, todas derivadas dos padrões na teoria:

  1. Anti-diagonal sum: <n>, a soma das células onde r + c == matrix.length - 1
  2. Column sums: [...], a soma de cada coluna. Dica: faça a transposição primeiro, depois mapeie cada linha para sua soma, então use inspect
  3. Symmetric: true ou false: 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: false

Folha de consulta

Operações comuns com arrays 2D em Ruby:

Somar todas as células — achatar (flatten) e depois somar:

grid.flatten.sum

Diagonal 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 false

Experimente 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
quiz iconTeste seus conhecimentos

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