py_spiral_matrix
Código comentado línea a línea y paso a paso:
Entregas: py_spiral_matrix.py con generate_spiral(n). Rank 05 · nivel 1.
Qué pide (en palabras normales)
- Una matriz
n × ncon los números del 1 aln²puestos en espiral: derecha, abajo, izquierda, arriba, y otra vez hacia dentro. generate_spiral(3)→[[1, 2, 3], [8, 9, 4], [7, 6, 5]].n <= 0→[].
Subject (enunciado original)
Write a function that generates an `n x n` 2D matrix filled with numbers from 1 to `n^2` in clockwise spiral order.
The spiral starts at the top-left cell (0, 0) moving right, then down, then left, then up, continuing inwards.
Expected file: py_spiral_matrix.py
Function signature:
def generate_spiral(n: int) -> list[list[int]]:
Examples:
generate_spiral(3)
=> [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
generate_spiral(1)
=> [[1]]
2 piezas
1. Cuatro bordes que se encogen
top, bottom, left, right = 0, n - 1, 0, n - 1
while top <= bottom and left <= right:
...
top += 1 # tras la fila de arriba
right -= 1 # tras la columna derecha
bottom -= 1 # tras la fila de abajo
left += 1 # tras la columna izquierda
Cada vuelta pinta el marco de la capa actual y mueve los cuatro bordes hacia dentro. El bucle para cuando se cruzan.
2. Los dos guards
if top <= bottom: # ¿queda fila de abajo?
...
if left <= right: # ¿queda columna izquierda?
...
Con n impar la última capa es una sola celda (o una sola fila/columna). Sin los guards la pintas dos veces y el centro sale mal. Pruébalo con n = 3: el 9 se escribiría dos veces.
Trampas
[[0] * n] * ncrea una fila repetida: escribir en una cambia todas. Usa la comprensión conrange(n).- Recorridos al revés:
range(right, left - 1, -1), el fin es exclusivo también con paso negativo.