Ejercicios prácticos de Python con soluciones detalladas

Ejercicio 1: Números narcisistas

Un número narcisista (también llamado número de Armstrong) es un número de n dígitos donde la suma de cada dígito elevado a la potencia n es igual al propio número.

for num in range(100, 1000):
    centenas = num // 100
    decenas = (num // 10) % 10
    unidades = num % 10
    if centenas**3 + decenas**3 + unidades**3 == num:
        print(f"{num} es un número narcisista")

Ejercicio 2: Números rosa de cuatro hojas

Los números rosa de cuatro hojas son números narcisistas de 4 dígitos.

for num in range(1000, 10000):
    millares = num // 1000
    centenas = (num // 100) % 10
    decenas = (num // 10) % 10
    unidades = num % 10
    if millares**4 + centenas**4 + decenas**4 + unidades**4 == num:
        print(f"{num} es un número rosa de cuatro hojas")

Ejercicio 3: Invertir una cadena

Método 1: Usando slicing

cadena = input("Introduce una cadena: ")
print(cadena[::-1])

Método 2: Usando un bucle

cadena = input("Introduce una cadena: ")
invertida = []
for i in range(len(cadena) - 1, -1, -1):
    invertida.append(cadena[i])
print(''.join(invertida))

Ejercicio 4: Juego de adivinanza de números

El juego ganera un número aleatorio entre 0 y 100. El jugador tiene 10 intentos para adivinarlo.

import random
secreto = random.randint(0, 100)
intentos_max = 10
for intento in range(intentos_max):
    intento_usuario = int(input("Adivina el número (0-100): "))
    if intento_usuario > secreto:
        print("Demasiado alto.")
    elif intento_usuario < secreto:
        print("Demasiado bajo.")
    else:
        print(f"¡Correcto! Lo adivinaste en {intento + 1} intentos.")
        break
    print(f"Te quedan {intentos_max - intento - 1} intentos.")
else:
    print(f"Se acabaron los intentos. El número era {secreto}.")

Ejercicio 5: Problema de los cien pollos y cien monedas

Encuentra todas las combinaciones posibles para comprar 100 pollos por 100 monedas, donde un gallo cuesta 5, una gallina 3 y tres pollitos 1.

combinaciones = 0
for gallos in range(1, 21):
    for gallinas in range(1, 34):
        pollitos = 100 - gallos - gallinas
        if pollitos > 0 and pollitos % 3 == 0:
            if 5 * gallos + 3 * gallinas + pollitos // 3 == 100:
                combinaciones += 1
                print(f"Combinación {combinaciones}: Gallos={gallos}, Gallinas={gallinas}, Pollitos={pollitos}")

Ejercicio 6: Año bisiesto y día del año

Determina si un año es bisiesto y calcula qué día del año es la fecha dada.

year = int(input("Año: "))
mes = int(input("Mes: "))
dia = int(input("Día: "))

es_bisiesto = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
dias_mes = [31, 29 if es_bisiesto else 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

print(f"{year} {'es' if es_bisiesto else 'no es'} un año bisiesto.")
dia_del_anio = dia + sum(dias_mes[:mes - 1])
print(f"{day}/{mes}/{year} es el día {dia_del_anio} del año.")

Ejercicio 7: Problema del mono y los melocotones

Un mono come melocotones durante 10 días. Cada día come la mitad más uno. El décimo día queda uno. ¿Cuántos había al principio?

melocotones = 1
for dia in range(9, 0, -1):
    melocotones = (melocotones + 1) * 2
print(f"El mono recogió inicialmente {melocotones} melocotones.")

Ejercicio 8: Ordenamiento burbuja

import random
lista = [random.randint(1, 100) for _ in range(10)]
print("Lista original:", lista)
n = len(lista)
for i in range(n - 1):
    for j in range(n - i - 1):
        if lista[j] > lista[j + 1]:
            lista[j], lista[j + 1] = lista[j + 1], lista[j]
print("Lista ordenada:", lista)

Ejercicio 9: Búsqueda binaria

Encuentra un elemento en una lista ordenada dividiendo repetidamente el espacio de búsqueda por la mitad.

def busqueda_binaria(elemento, lista):
    bajo, alto = 0, len(lista) - 1
    while bajo <= alto:
        medio = (bajo + alto) // 2
        if lista[medio] == elemento:
            return medio
        elif lista[medio] < elemento:
            bajo = medio + 1
        else:
            alto = medio - 1
    return -1

ejemplo_lista = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
objetivo = 23
resultado = busqueda_binaria(objetivo, ejemplo_lista)
print(f"El elemento {objetivo} está en el índice {resultado}.")

Ejercicio 10: Ordenamiento por selección

import random
datos = [random.randint(1, 100) for _ in range(10)]
n = len(datos)
for i in range(n - 1):
    indice_min = i
    for j in range(i + 1, n):
        if datos[j] < datos[indice_min]:
            indice_min = j
    datos[i], datos[indice_min] = datos[indice_min], datos[i]
print("Lista ordenada por selección:", datos)

Ejercicio 11: Piedra, papel o tijera

Un juego interactivo contra la computadora con sistema de puntuación.

import random
opciones = ["piedra", "papel", "tijera"]
puntos_jugador = 100
while True:
    computadora = random.choice(opciones)
    jugador = input("Elige (piedra/papel/tijera): ").lower()
    if jugador not in opciones:
        print("Opción no válida.")
        continue
    print(f"La computadora eligió: {computadora}")
    if jugador == computadora:
        print("¡Empate!")
    elif (jugador == "piedra" and computadora == "tijera") or \
         (jugador == "papel" and computadora == "piedra") or \
         (jugador == "tijera" and computadora == "papel"):
        puntos_jugador += 10
        print("¡Ganaste la ronda!")
    else:
        puntos_jugador -= 10
        print("Perdiste la ronda.")
    print(f"Puntos: {puntos_jugador}")
    if puntos_jugador <= 0:
        print("Game Over. Te quedaste sin puntos.")
        break
    elif puntos_jugador >= 200:
        print("¡Felicidades! Alcanzaste 200 puntos.")
        break

Ejercicio 12: Números felices

Un número es feliz si la suma de los cuadrados de sus dígitos eventualmente converge a 1.

def suma_cuadrados_digitos(n):
    return sum(int(d)**2 for d in str(n))

def es_feliz(numero):
    vistos = set()
    while numero != 1 and numero not in vistos:
        vistos.add(numero)
        numero = suma_cuadrados_digitos(numero)
    return numero == 1

print("¿Es 19 un número feliz?", es_feliz(19))

Ejercicio 13: Adivinar edades (I)

Encuentra dos edades cuyo producto sea 6 veces su suma y la diferencia sea menor a 8.

for edad1 in range(1, 100):
    for edad2 in range(1, edad1):
        if edad1 * edad2 == 6 * (edad1 + edad2) and (edad1 - edad2) < 8:
            print(f"Las edades son {edad1} y {edad2}.")

Ejercicio 14: Adivinarr edades (II)

Encuentra una edad donde su cubo sea un número de 4 dígitos, su cuarta potencia sea de 6 dígitos, y juntos usen todos los dígitos del 0 al 9 exactamente una vez.

for edad in range(10, 30):
    cubo = str(edad ** 3)
    cuarta = str(edad ** 4)
    if len(cubo) == 4 and len(cuarta) == 6:
        if len(set(cubo + cuarta)) == 10:
            print(f"La edad es {edad}.")

Ejercicio 15: Implementar el método split

Divide una cadena usando un delimitador sin usar el método split integrado.

def mi_split(cadena, delimitador=''):
    resultado = []
    inicio = 0
    for i in range(len(cadena)):
        if cadena[i] == delimitador:
            if i > inicio:
                resultado.append(cadena[inicio:i])
            inicio = i + 1
    if inicio < len(cadena):
        resultado.append(cadena[inicio:])
    return resultado

print(mi_split("hola-mundo-python", '-'))

Ejercicio 16: Serie de Da Yan

Genera los primeros 100 términos de la serie según la regla: para posición par, (n²)/2; para impar, (n²-1)/2.

for n in range(1, 101):
    if n % 2 == 0:
        termino = n**2 // 2
    else:
        termino = (n**2 - 1) // 2
    print(termino)

Ejercicio 17: Análisis de frecuencia de caracteres

Encuentra el carácter que más se repite en una cadena.

def caracter_mas_frecuente(cadena):
    frecuencias = {}
    for c in cadena:
        frecuencias[c] = frecuencias.get(c, 0) + 1
    max_car = max(frecuencias, key=frecuencias.get)
    return max_car, frecuencias[max_car]

car, cant = caracter_mas_frecuente("programacion")
print(f"El carácter más frecuente es '{car}' con {cant} apariciones.")

Ejercicio 18: Dibujar un diamante con asteriscos

Imprime un diamante de asteriscos de lado n.

def diamante(n):
    for i in range(1, n + 1):
        print(' ' * (n - i) + '*' * (2 * i - 1))
    for i in range(n - 1, 0, -1):
        print(' ' * (n - i) + '*' * (2 * i - 1))

diamante(5)

Ejercicio 19: Concepto de recursividad

La recursividad es cuando una función se llama a sí misma.

def cuenta_regresiva(n):
    if n <= 0:
        print("¡Despegue!")
    else:
        print(n)
        cuenta_regresiva(n - 1)

cuenta_regresiva(5)

Ejercicio 20: Sucesión de Fibonacci

def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

for i in range(10):
    print(fibonacci(i), end=" ")

Ejercicio 21: Encontrar el máximo de tres números

Sin usar funciones integradas.

a, b, c = 10, 6, 18
maximo = a
if b > maximo:
    maximo = b
if c > maximo:
    maximo = c
print("El máximo es:", maximo)

Ejercicio 22: Números perfectos

Un número es perfecto si es igual a la suma de sus divisores propios.

def suma_divisores(n):
    return sum(i for i in range(1, n) if n % i == 0)

for num in range(1, 10000):
    if num == suma_divisores(num):
        print(f"{num} es un número perfecto.")

Ejercicio 23: Suma de factoriales

Calcula la suma 1! + 2! + ... + 10!.

def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)

total = sum(factorial(i) for i in range(11))
print("La suma es:", total)

Ejercicio 24: Paréntesis válidos

Verifica si una cadena de paréntesis, corchetes y llaves está balanceada.

def validar_parentesis(cadena):
    pila = []
    pares = {')': '(', ']': '[', '}': '{'}
    for caracter in cadena:
        if caracter in pares.values():
            pila.append(caracter)
        elif caracter in pares.keys():
            if not pila or pila.pop() != pares[caracter]:
                return False
    return len(pila) == 0

print(validar_parentesis("{[()]}"))
print(validar_parentesis("{[(])}"))

Ejercicio 25: Números palíndromos

Un palíndromo se lee igual de izquierda a derecha y de derecha a izquierda.

def es_palindromo(numero):
    if numero < 0:
        return False
    cadena = str(numero)
    return cadena == cadena[::-1]

# Método sin convertir a cadena
def es_palindromo_numerico(n):
    if n < 0:
        return False
    original = n
    invertido = 0
    while n > 0:
        invertido = invertido * 10 + n % 10
        n //= 10
    return original == invertido

print("¿Es 12321 un palíndromo?", es_palindromo(12321))
print("¿Es 12321 un palíndromo (numérico)?", es_palindromo_numerico(12321))

Etiquetas: Python algoritmos bucles funciones recursividad

Publicado el 6-1 23:43