Practica el bucle while resolviendo ocho retos
Desde la cuenta atrás de un globo sonda hasta la conjetura de Collatz: programa, ejecuta, prueba casos límite y comprende cuándo termina cada bucle.
Cuenta atrás para el globo sonda
★☆☆☆ · Contador · cero vueltasUn globo sonda está a punto de despegar. Escribe un programa que pregunte cuántos segundos faltan y haga la cuenta atrás hasta 1. Después debe mostrar ¡Despegue!.
Segundos para el despegue: 3
3
2
1
¡Despegue!
Prueba también con 0. ¿Qué ocurre? ¿Por qué?
Pista
¿qué tiene que cambiar en cada vuelta para que el bucle termine?
La salida aparecerá aquí.
Con 0, la condición 0 > 0 es falsa desde el principio: el bucle no da ninguna vuelta y el globo despega sin cuenta atrás.
Las mil y una noches
★★☆☆ · Centinela · condición dobleCada noche, Sherezade cuenta una historia y la deja a medias. Al amanecer, el rey decide si quiere saber cómo sigue.
Escribe un programa que:
- muestre cada noche:
Noche 1 · Sherezade cuenta una historia...; - pregunte después:
¿Quiere el rey saber cómo sigue? (s/n); - continúe mientras el rey responda
s; - al terminar, muestre cuántas noches ha sobrevivido Sherezade.
Reto: si se llega a la noche 1001, el programa se detiene sin preguntar y muestra Tras mil y una noches, el rey perdona a Sherezade.
Noche 1 · Sherezade cuenta una historia...
¿Quiere el rey saber cómo sigue? (s/n): s
Noche 2 · Sherezade cuenta una historia...
¿Quiere el rey saber cómo sigue? (s/n): n
Sherezade sobrevivió 2 noches.
Pista
la condición del while tiene que vigilar dos cosas a la vez.
La salida aparecerá aquí.
seguir empieza valiendo "s" para que el bucle entre la primera noche.
La puerta del laboratorio
★★☆☆ · break · elseLa puerta del laboratorio se abre con la contraseña lora2026. Solo hay tres intentos.
- Si se acierta, muestra en qué intento se ha abierto y termina.
- Si se falla, muestra cuántos intentos quedan.
- Si se agotan los tres, muestra
Cuenta bloqueada.
Contraseña: hola
Incorrecta. Intentos restantes: 2
Contraseña: lora2026
Acceso concedido en el intento 2
Pista
el mensaje de bloqueo solo debe aparecer si el bucle termina sin haber acertado. Hay una herramienta exacta para eso.
La salida aparecerá aquí.
El else solo se ejecuta si el bucle termina por su condición, es decir, si nunca se llegó al break.
El sensor caprichoso
★★☆☆ · while True · validaciónEl sensor de temperatura de una estación meteorológica solo mide bien entre −40 °C y 85 °C. A veces devuelve valores absurdos.
Escribe un programa que pida lecturas hasta recibir una válida. Al final, muestra la lectura aceptada y cuántas lecturas erróneas hubo antes.
Temperatura del sensor (°C): 120
Lectura fuera de rango. Repite la medida.
Temperatura del sensor (°C): -50
Lectura fuera de rango. Repite la medida.
Temperatura del sensor (°C): 21.5
Lectura aceptada: 21.5 °C tras 2 lecturas erróneas.
Pista
hay que leer al menos una vez antes de poder decidir si se repite.
La salida aparecerá aquí.
Es el patrón «haz y luego pregunta»: Python no tiene do … while, y se resuelve con while True y break.
La altitud media del vuelo
★★★☆ · continue · acumuladorDurante el vuelo, el globo envía lecturas de altitud en metros. Algunas llegan corruptas y son negativas.
Escribe un programa que:
- pida lecturas hasta que se escriba
FIN; - descarte las negativas, sin sumarlas ni contarlas como válidas;
- muestre la altitud media de las lecturas válidas y cuántas se descartaron;
- no falle si no hay ninguna lectura válida.
Altitud en metros (FIN para terminar): 100
Altitud en metros (FIN para terminar): -3
Altitud en metros (FIN para terminar): 300
Altitud en metros (FIN para terminar): FIN
Media: 200.0 m con 2 lecturas válidas.
Lecturas descartadas: 1
Pista 1
compara con "FIN" antes de convertir a float(). ¿Por qué?
Pista 2
¿qué ocurriría al calcular la media si no hubiera ninguna lectura válida?
La salida aparecerá aquí.
float("FIN")provoca un error. Por eso se compara primero con el texto.continuees seguro aquí porque la siguiente lectura se pide al principio de cada vuelta: saltarse el resto no impide avanzar.- Sin lecturas válidas,
total / validasdividiría entre 0. Eliflo evita.
Arregla el Zune
★★★☆ · Depuración · bucle infinitoEl 31 de diciembre de 2008, miles de reproductores Zune de Microsoft se quedaron congelados. Este es el bucle culpable, traducido a Python. Recibe los días transcurridos desde el 1 de enero de 1980 y calcula el año y el día del año:
dias = 10593 # 31 de diciembre de 2008
anio = 1980
while dias > 365:
if anio % 4 == 0: # año bisiesto (regla simplificada)
if dias > 366:
dias -= 366
anio += 1
else:
dias -= 365
anio += 1
print("Año", anio, "· día", dias)
- Sin ejecutarlo, explica por qué no termina con
dias = 10593. ¿Con qué valores dediasyaniose queda atascado? - Corrígelo para que muestre
Año 2008 · día 366. - Comprueba que con
dias = 10592(30 de diciembre) muestraAño 2008 · día 365.
Si se queda colgado: en la terminal, pulsa Ctrl + C.
Pista
cuando dias vale exactamente 366 en un año bisiesto, el cálculo ya ha terminado. Hay que decírselo al bucle.
La salida aparecerá aquí.
La regla anio % 4 == 0 funciona entre 1901 y 2099. La regla completa tiene en cuenta además los múltiplos de 100 y de 400.
Adivina el número
★★★☆ · Búsqueda · siete intentosUn juego para dos personas:
- el jugador 1 escribe un número secreto entre 1 y 100, sin que el otro lo vea;
- el jugador 2 tiene 7 intentos para adivinarlo;
- después de cada intento, el programa responde
Más alto.oMás bajo.; - si acierta, muestra en cuántos intentos; si se agotan, revela el número.
Jugador 1, escribe el número secreto (1 a 100): 37
Jugador 2, ¿qué número es?: 50
Más bajo.
Jugador 2, ¿qué número es?: 25
Más alto.
Jugador 2, ¿qué número es?: 37
¡Acertaste en 3 intentos!
Curiosidad: con 7 intentos siempre se puede acertar si se juega bien. Si en cada intento se elige el número del medio del intervalo que queda, el intervalo se reduce a la mitad cada vez: 100 → 50 → 25 → 12 → 6 → 3 → 1, y en el séptimo intento solo queda una posibilidad. ¿Por qué crees que funciona?
La salida aparecerá aquí.
La estrategia de partir por la mitad se llama búsqueda binaria: 2⁷ = 128, y 128 es mayor que 100. Comprobado: con esa estrategia, el peor caso entre 1 y 100 necesita exactamente 7 intentos.
El misterio de Collatz
★★★★ · Collatz · desafíoToma un número entero positivo. Si es par, divídelo entre 2; si es impar, multiplícalo por 3 y súmale 1. Repite mientras no llegues a 1. Nadie ha demostrado que este proceso termine siempre.
Escribe un programa que:
- pida un número y lo vuelva a pedir mientras no sea mayor que 0;
- calcule cuántos pasos tarda en llegar a 1;
- muestre también el valor máximo que alcanza por el camino.
Número entero positivo: -4
Tiene que ser mayor que 0.
Número entero positivo: 27
27 llega a 1 en 111 pasos. Máximo alcanzado: 9232
Prueba con 26 y después con 27. ¿Te esperabas tanta diferencia?
La salida aparecerá aquí.
inicio guarda el número original, porque n cambia en cada vuelta.
Reto extra · Collatz del 1 al 100
¿Qué número entre 1 y 100 necesita más pasos para llegar a 1? Hace falta un while dentro de otro while.
Mostrar solución del reto extra
candidato = 1
mejor = 1
mas_pasos = 0
while candidato <= 100:
n = candidato
pasos = 0
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
pasos += 1
if pasos > mas_pasos:
mas_pasos = pasos
mejor = candidato
candidato += 1
print("Hasta 100, el que más pasos necesita es", mejor, "con", mas_pasos)Resultado: 97, con 118 pasos.