Saltar al contenido
Regresar

Capicúas y Productos: Encuentra el Mayor con Python

Publicado:  a las  05:55 p.m.

¿Te imaginas buscar un tesoro matemático oculto entre la multitud de números? 💎 ¡Desentrañemos el misterio del producto capicúa más grande!

🔮 Enunciado del Problema

El desafío es encontrar, dentro de un rango de números dado, aquellos dos números cuyo producto resulta en el capicúa (o palíndromo numérico) más grande posible. Un capicúa, al igual que un palíndromo textual, se lee igual de izquierda a derecha que de derecha a izquierda (ej: 9009, 1221).

Parámetros:

Retorno:

Ejemplos:

>>> sorted(largest_capicua_product(10, 99)) == [91, 99]
True
>>> sorted(largest_capicua_product(100, 999)) == [913, 993]
True

Notas Adicionales:

🧩 Resolución Paso a Paso

Nuestra estrategia se centra en identificar todos los productos capicúa posibles dentro del rango, para luego determinar cuál es el mayor y retornar los factores que lo generan.

Primero, necesitamos una función que nos determine si un número es un capicúa. Esto es simple: convertimos el número a una cadena y comparamos con su versión invertida.

def is_capicua(num):
	return str(num) == str(num)[::-1]

Aquí, str(num) convierte el número en una cadena y [::-1] es una notación concisa para invertir la cadena.

El núcleo de la solución es la función largest_capicua_product. Utilizamos una comprensión de diccionario para generar un diccionario donde las claves son los productos capicúa y los valores son los pares de números que los generan.

def largest_capicua_product(start, end):
	products = {(x * y): [x, y] for x in range(start, end + 1) for y in range(start, end + 1) if is_capicua(x * y)}
	return products[max(products.keys())] if len(products) > 0 else []

Este bloque de código realiza una iteración sobre todos los pares de números posibles dentro del rango dado. Para cada par, calcula su producto y verifica si es un capicúa utilizando la función is_capicua. Si lo es, agrega el producto como clave y el par de números como valor al diccionario products.

Finalmente, si encontramos algún producto capicúa (es decir, el diccionario products no está vacío), encontramos la clave máxima (el producto capicúa más grande) y retornamos el valor asociado a esa clave (el par de números que lo produce). Si no encontramos ningún producto capicúa, retornamos una lista vacía.

Solución Completa:

def is_capicua(num):
	return str(num) == str(num)[::-1]

def largest_capicua_product(start, end):
	products = {(x * y): [x, y] for x in range(start, end + 1) for y in range(start, end + 1) if is_capicua(x * y)}
	return products[max(products.keys())] if len(products) > 0 else []

🧠 Conceptos Clave

La comprensión de diccionarios es fundamental aquí. Nos permite crear el diccionario de productos capicúa de forma concisa y legible, evitando la necesidad de bucles for y sentencias if más extensas. Es una herramienta poderosa para la manipulación de datos en Python.

El concepto de slicing en cadenas, específicamente [::-1], es crucial para invertir la cadena y determinar si un número es un capicúa. Esta sintaxis elegante es una forma eficiente de invertir secuencias en Python.

La correcta utilización de bucles anidados es esencial para iterar sobre todas las combinaciones posibles de números dentro del rango dado. Esto garantiza que ningún producto capicúa potencial sea omitido.

El uso de condicionales ternarios permite expresar de forma concisa la lógica de retornar el par de números o una lista vacía dependiendo de si se encontraron productos capicúa o no. Es una forma elegante de expresar lógica condicional simple en una sola línea.

💫 Reflexiones Finales

Esta solución, si bien funcional, puede optimizarse para rangos muy grandes. Podríamos reducir el espacio de búsqueda considerando solo productos de números mayores o iguales a la raíz cuadrada del posible capicúa más grande. Además, la generación de todos los productos en memoria puede ser costosa para rangos extremadamente amplios; una solución basada en generadores podría ser más eficiente en esos casos.

¿Sabías que…? 🤔 La búsqueda del palíndromo más grande formado por el producto de dos números de n dígitos es un problema recurrente en competiciones de programación y es una buena forma de ilustrar la importancia de la optimización algorítmica.

Espero que este recorrido por el mundo de los capicúas te haya resultado tan interesante como a mí. Si te ha gustado este artículo, ¡no dudes en explorar más desafíos de programación en nuestro blog! ¡El siguiente problema te espera! 🚀



Publicación anterior
Factorización Prima Rápida: Encuentra el Factor Primo Más Pequeño
Siguiente publicación
Anagramas: Detecta si dos palabras son iguales reordenadas