Largest Product in a Series
El número de 1000 dígitos contiene patrones de dígitos consecutivos. Encuentra los 13 dígitos adyacentes que al multiplicarse dan el producto más grande.
1 Entendiendo el Problema
Tenemos un número gigante de 1000 dígitos. Debemos encontrar 13 dígitos consecutivos cuyo producto sea máximo. La clave: un solo cero arruina todo el producto.
El número de 1000 dígitos:
Estrategia manual:
Identificar los ceros
Cualquier ventana con un cero tiene producto = 0. Marcamos los ceros en rojo para evitarlos.
Buscar dígitos grandes consecutivos
Queremos 9s, 8s, 7s consecutivos. 9 × 9 × 9 = 729 vs 2 × 2 × 2 = 8
Calcular productos candidatos
Probamos algunas secuencias prometedoras: 9781797784617...
Ventana deslizante visual:
2 Fuerza Bruta - 3 Variantes
El enfoque directo: probar todas las ventanas de 13 dígitos y calcular el producto de cada una.
Variante A: while True + break
Iteramos con índice manual hasta el final del string.
Variante B: while condición
Condición directa en el while.
Variante C: for range
Usando range para iterar posiciones.
Análisis de complejidad
n = 1000 posiciones, k = 13 dígitos
Solo variables auxiliares
3 Enfoque Pythónico
Usando math.prod, comprensiones, y max con key function.
Herramientas usadas
math.prod()— Producto de iterables (Python 3.8+)max(key=)— Máximo con función de comparación- List comprehension — Generar ventanas
''.join(map())— Reconstruir string
Alternativa con generador
# Memoria constante con generador
windows = (
digits[i:i+13]
for i in range(len(digits) - 12)
)
max(windows, key=prod)
4 Optimización Matemática
La ventana deslizante puede optimizarse: en vez de recalcular 13 multiplicaciones en cada paso, podemos dividir y multiplicar... pero los ceros complican todo.
Estrategia con ceros
Cuando encontramos un cero, no tiene sentido seguir con esa ventana. Saltamos directamente al siguiente segmento sin ceros:
Comparación de rendimiento
| Método | Complejidad | Operaciones (n=1000, k=13) |
|---|---|---|
| Fuerza bruta | O(n × k) | ~12,844 multiplicaciones |
| Con skip de ceros | O(n) amortizado | ~8,000 multiplicaciones |
Nota sobre división en ventana deslizante
Teóricamente podríamos hacer P_new = P_old / d_out × d_in, pero la división por cero y los errores de punto flotante lo hacen impracticable. La estrategia de saltar segmentos con ceros es más robusta y eficiente en la práctica.