← Euler Lab
#011

Producto en Cuadrícula

Cargando Python...

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).

Matrices 2D Vectores de dirección Búsqueda exhaustiva

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.

Horizontal
Vertical
Diagonal ↘
Diagonal ↙

La cuadrícula 20×20 (click para ver el máximo):

Secuencia ganadora (diagonal ↘):

89
94
97
87

89 × 94 × 97 × 87 = 70,600,674

Respuesta
70,600,674
Posición
Fila 12, Col 6 ↘

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.

Python
// Output aparecerá aquí

Variante B: while condición

Condiciones directas en los while.

Python
// Output aparecerá aquí

Variante C: for range

Usando for con range y vectores de dirección.

Python
// Output aparecerá aquí

Análisis de complejidad

Tiempo
O(n² × k × d)

n²=400 celdas, k=4 longitud, d=4 direcciones

Espacio
O(n²)

Almacenar la cuadrícula

3 Enfoque Pythónico

Usando math.prod, generadores, y comprensiones elegantes.

Python
// Output aparecerá aquí

Herramientas usadas

  • yield — Generador perezoso de secuencias
  • math.prod() — Producto de iterables
  • max(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.

grid[:-3] × grid[1:-2] × grid[2:-1] × grid[3:]
Productos verticales vectorizados
O(n²) → O(n²/SIMD)
Aceleración por vectorización
Python — NumPy vectorizado
// Output aparecerá aquí

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.