py_spiral_matrix · Python
▶ Aprender py_spiral_matrix (Python) paso a paso · explicación de py_spiral_matrix
Código línea a línea
Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.
py_spiral_matrix.py
| Código | Subject | Por qué |
|---|---|---|
def generate_spiral(n: int) -> list[list[int]]: | def generate_spiral(n: int) -> list[list[int]]: | Firma del subject. Devuelve lista de listas, no imprime. |
if n <= 0: | generates an `n x n` 2D matrix | Sin tamaño no hay matriz. Guard antes de reservar nada. |
return [] | Lista vacía, no None: el tipo de retorno es lista. | |
grid = [[0] * n for _ in range(n)] | 2D matrix filled with numbers from 1 to `n^2` | n filas nuevas con range. Ojo: [[0]*n]*n sería la misma fila repetida n veces. |
top, bottom, left, right = 0, n - 1, 0, n - 1 | continuing inwards | Los cuatro bordes de la capa actual. Cada vuelta los encojo. |
value = 1 | from 1 to `n^2` | El siguiente número a colocar. |
while top <= bottom and left <= right: | continuing inwards | Mientras quede capa: cuando los bordes se cruzan, acabé. |
for col in range(left, right + 1): | moving right | Fila de arriba, de izquierda a derecha. right + 1 porque range excluye el final. |
grid[top][col] = value | Coloco y avanzo el contador. | |
value += 1 | Siguiente número. | |
top += 1 | Esa fila ya está: el borde superior baja. | |
for row in range(top, bottom + 1): | then down | Columna derecha, de arriba abajo, empezando en el nuevo top. |
grid[row][right] = value | Coloco y avanzo. | |
value += 1 | Siguiente número. | |
right -= 1 | Columna hecha: el borde derecho entra. | |
if top <= bottom: | then left | Guard: si solo quedaba una fila, ya la pinté yendo a la derecha. Sin esto la repito. |
for col in range(right, left - 1, -1): | then left | Fila de abajo al revés: paso -1 y fin left - 1 para incluir left. |
grid[bottom][col] = value | Coloco y avanzo. | |
value += 1 | Siguiente número. | |
bottom -= 1 | Borde inferior sube. | |
if left <= right: | then up | Mismo guard para la columna: si solo quedaba una, ya está pintada. |
for row in range(bottom, top - 1, -1): | then up | Columna izquierda de abajo arriba. |
grid[row][left] = value | Coloco y avanzo. | |
value += 1 | Siguiente número. | |
left += 1 | Borde izquierdo entra: la capa está cerrada. | |
return grid | generate_spiral(3) | [[1, 2, 3], [8, 9, 4], [7, 6, 5]]. |