py_prism_detector · Python

▶ Aprender py_prism_detector (Python) paso a paso · explicación de py_prism_detector

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_prism_detector.py
CódigoSubjectPor qué
DIRECTIONS = [The directions and their codes are:Tabla de las 8 direcciones, en el orden exacto del subject. Cada entrada: paso en x, paso en y, código.
(1, 0, "H"),(1, 0) -> "H" (Horizontal right)Derecha.
(-1, 0, "H-"),(-1, 0) -> "H-" (Horizontal left)Izquierda.
(0, 1, "V"),(0, 1) -> "V" (Vertical down)Abajo: y crece.
(0, -1, "V-"),(0, -1) -> "V-" (Vertical up)Arriba.
(1, 1, "D1"),(1, 1) -> "D1" (Diagonal down-right)Diagonal abajo-derecha.
(-1, -1, "D1-"),(-1, -1) -> "D1-" (Diagonal up-left)Y su inversa.
(-1, 1, "D2"),(-1, 1) -> "D2" (Diagonal up-right)Ojo: D2 es x hacia la izquierda, y hacia abajo. El nombre engaña; copia los números.
(1, -1, "D2-"),(1, -1) -> "D2-" (Diagonal down-left)Y su inversa.
]Fin de la tabla.
def prism_detector(grid: list[str], pattern: str):def prism_detector(grid: list[str], pattern: str):Firma del subject. Sin anotación de retorno: devuelve una lista.
if not grid or not pattern:Return an empty list `[]` if either `grid` or `pattern` is empty.Casos vacíos primero. También evita pattern[0] sobre un string vacío.
return []Return an empty list `[]`Lista vacía, no None.
rows = len(grid)Número de filas.
found = []Return a list of tuples `(x, y, direction_code)` for each matchAquí acumulo las tuplas.
for y in range(rows):`y` is the row index of the first characterRecorro filas (y) y dentro columnas (x). Ese orden da el mismo orden de salida que el ejemplo.
for x in range(len(grid[y])):`x` is the column indexUso el largo de cada fila, por si no son todas iguales.
if grid[y][x] != pattern[0]:Atajo: si la primera letra no coincide, no hay nada que mirar en ninguna dirección.
continueSiguiente celda.
for dx, dy, code in DIRECTIONS:in all 8 cardinal and diagonal directionsPruebo las 8 direcciones en orden.
if matches(grid, pattern, x, y, dx, dy):Una función aparte para comprobar un rayo: queda legible.
found.append((x, y, code))Return a list of tuples `(x, y, direction_code)`Tupla (x, y, código): columna primero, fila después. El orden al revés es el fallo típico.
return foundReturn a list of tuplesTodas las coincidencias.
def matches(grid, pattern, x, y, dx, dy):¿El patrón cabe entero desde (x, y) avanzando (dx, dy)?
for ch in pattern:Letra a letra.
if not (0 <= y < len(grid) and 0 <= x < len(grid[y])) or grid[y][x] != ch:Fuera del tablero o letra distinta: no cuadra. Compruebo límites antes de indexar: un índice negativo en Python no falla, da la otra punta.
return FalseFalla.
x += dxAvanzo en la dirección.
y += dyIdem.
return TrueTodas las letras encajaron.