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ódigo | Subject | Por 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 match | Aquí acumulo las tuplas. |
for y in range(rows): | `y` is the row index of the first character | Recorro 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 index | Uso 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. | |
continue | Siguiente celda. | |
for dx, dy, code in DIRECTIONS: | in all 8 cardinal and diagonal directions | Pruebo 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 found | Return a list of tuples | Todas 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 False | Falla. | |
x += dx | Avanzo en la dirección. | |
y += dy | Idem. | |
return True | Todas las letras encajaron. |