Patrones comunes en 2D
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 13 de 56.
Algunas operaciones con arreglos 2D aparecen con tanta frecuencia que vale la pena reconocerlas por su nombre.
Sumar cada celda: aplana la cuadrícula en un array unidimensional y llama a sum:
grid = [[1, 2], [3, 4]]
puts grid.flatten.sum # 10Diagonal principal: las celdas donde el índice de fila es igual al índice de columna (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, 9Transponer: Ruby tiene esto incorporado. Las filas se convierten en columnas y viceversa:
matrix.transpose
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]Conocer estos por su nombre te evita reescribir los mismos bucles anidados.
Desafío
FácilSe proporciona la matrix cuadrada (n × n). Imprime tres líneas, todas derivadas de los patrones de la teoría:
Anti-diagonal sum: <n>, la suma de las celdas donder + c == matrix.length - 1Column sums: [...], la suma de cada columna. Pista: primero transpón, luego mapea cada fila a su suma, después usainspectSymmetric: trueofalse: ¿es la matriz igual a su propia transpuesta?
Para la matriz por defecto, la salida es:
Anti-diagonal sum: 15
Column sums: [12, 15, 18]
Symmetric: falseHoja de referencia
Operaciones comunes con arreglos bidimensionales en Ruby:
Sumar todas las celdas — aplanar y luego sumar:
grid.flatten.sumDiagonal principal — celdas donde el índice de fila es igual al índice de columna (matrix[i][i]):
(0...matrix.length).each { |i| puts matrix[i][i] }
# i == 0: matrix[0][0], i == 1: matrix[1][1], ...Anti-diagonal — celdas donde r + c == matrix.length - 1:
(0...matrix.length).each { |i| puts matrix[i][matrix.length - 1 - i] }Transponer — las filas se convierten en columnas:
matrix.transpose
# [[1,4,7],[2,5,8],[3,6,9]]Sumas de columnas — transponer primero, luego sumar cada fila:
matrix.transpose.map(&:sum) # [col0_sum, col1_sum, ...]Comprobar simetría — comparar la matriz con su transpuesta:
matrix == matrix.transpose # true o falsePruébalo tú mismo
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# TODO: suma de la diagonal secundaria, sumas de columnas mediante transposición, comprobación de simetría
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline3Arreglos 2D
Conceptos básicos de arreglos 2DAcceso a elementos 2DIteración sobre arreglos 2DPatrones comunes en 2DResumen - Operaciones con matrices6Proyecto - Gestor de biblioteca
Descripción general del proyectoAñadir libro