Largest Product in a Grid
En una cuadrícula de 20×20, encuentra el mayor producto de 4 números adyacentes en la misma dirección (horizontal, vertical o diagonal).
1 Entendiendo el Problema
Tenemos una cuadrícula 20×20 con 400 números. Debemos encontrar 4 números consecutivos (en línea) cuyo producto sea máximo. Hay 4 direcciones posibles.
La cuadrícula 20×20 (click para ver el máximo):
Secuencia ganadora (diagonal ↘):
89 × 94 × 97 × 87 = 70,600,674
2 Fuerza Bruta - 3 Variantes
Recorremos cada celda y probamos las 4 direcciones posibles.
Variante A: while True + break
Bucles con break para cada dirección.
Variante B: while condición
Condiciones directas en los while.
Variante C: for range
Usando for con range y vectores de dirección.
Análisis de complejidad
n²=400 celdas, k=4 longitud, d=4 direcciones
Almacenar la cuadrícula
3 Enfoque Pythónico
Usando math.prod, generadores, y comprensiones elegantes.
Herramientas usadas
yield— Generador perezoso de secuenciasmath.prod()— Producto de iterablesmax(generator)— Máximo sin lista intermedia- Tuplas de direcciones
Vectores de dirección
# (dr, dc) = delta row, delta col (0, 1) # → horizontal (1, 0) # ↓ vertical (1, 1) # ↘ diagonal (1, -1) # ↙ anti-diagonal
4 Enfoque con NumPy
Para cuadrículas grandes, NumPy permite operaciones vectorizadas mucho más rápidas usando convoluciones o slicing avanzado.
Comparación de rendimiento
| Método | Cuadrícula 20×20 | Cuadrícula 1000×1000 |
|---|---|---|
| Python puro (loops) | ~1 ms | ~2 segundos |
| NumPy vectorizado | ~0.1 ms | ~10 ms |
El poder del slicing NumPy
En vez de iterar celda por celda, NumPy nos permite operar sobre todas las posiciones a la vez.
g[:, :-3] * g[:, 1:-2] * g[:, 2:-1] * g[:, 3:] calcula todos los productos horizontales en una sola operación vectorizada, aprovechando instrucciones SIMD del procesador.