Trotero · Laboratorio Python

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.

Python se cargará al ejecutar el primer ejercicio
Las ejecuciones prolongadas pueden detenerse. Python funciona dentro de tu navegador.
1

Cuenta atrás para el globo sonda

★☆☆☆ · Contador · cero vueltas

Un 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?

Tu códigoPython
ConsolaPreparada
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.

2

Las mil y una noches

★★☆☆ · Centinela · condición doble

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

Tu códigoPython
ConsolaPreparada
La salida aparecerá aquí.

seguir empieza valiendo "s" para que el bucle entre la primera noche.

3

La puerta del laboratorio

★★☆☆ · break · else

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

Tu códigoPython
ConsolaPreparada
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.

4

El sensor caprichoso

★★☆☆ · while True · validación

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

Tu códigoPython
ConsolaPreparada
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.

5

La altitud media del vuelo

★★★☆ · continue · acumulador

Durante 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?

Tu códigoPython
ConsolaPreparada
La salida aparecerá aquí.
  • float("FIN") provoca un error. Por eso se compara primero con el texto.
  • continue es seguro aquí porque la siguiente lectura se pide al principio de cada vuelta: saltarse el resto no impide avanzar.
  • Sin lecturas válidas, total / validas dividiría entre 0. El if lo evita.
6

Arregla el Zune

★★★☆ · Depuración · bucle infinito

El 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)
  1. Sin ejecutarlo, explica por qué no termina con dias = 10593. ¿Con qué valores de dias y anio se queda atascado?
  2. Corrígelo para que muestre Año 2008 · día 366.
  3. Comprueba que con dias = 10592 (30 de diciembre) muestra Añ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.

Tu códigoPython
ConsolaPreparada
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.

7

Adivina el número

★★★☆ · Búsqueda · siete intentos

Un 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. o Má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?

Tu códigoPython
ConsolaPreparada
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.

8

El misterio de Collatz

★★★★ · Collatz · desafío

Toma 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?

Tu códigoPython
ConsolaPreparada
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.

Trotero · Conocimiento · PythonMotor Python en navegador · Trabajo local, sin enviar tu código al servidor