Guías de ejemplo

Guía 1 — Ejercicios en Python

Programación I

0 de 3

Ejercicio 1 de 3

1Juego: la máquina adivina un número

0/7
No hay ejercicios resueltos de la cátedra: se usan las convenciones estándar de Python 3 (índices desde 0, random.randint(a, b) incluye ambos extremos, sorted es estable). Tu cátedra puede pedir otra forma de escribir las soluciones; las claves de abajo se verificaron ejecutando el código.

El jugador ingresa un número entre 1 y 10 y la máquina intenta adivinarlo. La máquina tiene 5 intentos; si se terminan sin acertar, gana el jugador. Para adivinar, la máquina usa:

numero = random.randint(1, 10) # número aleatorio del 1 al 10

Al terminar el juego se debe informar quién ganó y la lista de números que intentó la máquina. Ejemplo de salida de la guía:

Ingrese un número: 5
Es el 3 !
Es el 5 !
Es el 1 !
Es el 4 !
Es el 1 !
Humano ganó el juego
Los números fueron: [3, 5, 1, 4, 1]

Errata en el ejemplo de la guía: la máquina dice 5 en el segundo intento (el número ingresado era 5) y aun así el juego sigue y gana el humano. Esta unidad usa la lectura que sigue la consigna: si la máquina acierta, gana la máquina y el juego termina en ese intento. Con la lectura literal del ejemplo, la máquina nunca podría ganar y el juego no tendría sentido.
La máquina elige cada intento con randint de forma independiente, así que puede repetir números (en el ejemplo repite el 1). Las preguntas de probabilidad usan esa lectura.

1.a¿Qué valores puede devolver random.randint(1, 10)?

Ver desarrollo

random.randint(a, b) devuelve un entero NN con a≤N≤ba \le N \le b: a diferencia de range(a, b), incluye el extremo superior. Equivale a random.randrange(a, b + 1).

Con a=1a = 1 y b=10b = 10 hay 10 resultados posibles: {1,2,…,10}\{1, 2, \dots, 10\}, justo el rango del juego. Para reales en [0,1)[0, 1) está random.random(), y para reales en [a,b][a, b], random.uniform(a, b).

1.bEl jugador ingresa 5 y randint devuelve, en orden, 3, 5, 1, 4, 1. Según las reglas del juego, ¿qué tiene que informar el programa al terminar?

Ver desarrollo

Intento 1: 3 ≠ 5, se agrega a la lista y sigue. Intento 2: 5 = 5, acierta: se agrega el 5, gana la máquina y el bucle se corta con break. Los intentos 3 a 5 no ocurren.

Lista final: [3, 5]. La opción A reproduce la errata del ejemplo de la guía; la C olvida cortar el bucle; la D agrega el número a la lista sólo cuando falla.

Solución de referencia completa:

import random

numero = int(input("Ingrese un número: "))
intentos = []
ganador = "Humano"
for _ in range(5):
    n = random.randint(1, 10)
    intentos.append(n)
    print("Es el", n, "!")
    if n == numero:
        ganador = "Máquina"
        break
print(ganador, "ganó el juego")
print("Los números fueron:", intentos)

1.cEl jugador ingresa 7 y randint devolvería, en orden, 2, 9, 7, 7, 1. ¿Cuántos números tiene la lista que se muestra al final?

números
Ver desarrollo

2 ≠ 7 (lista [2]), 9 ≠ 7 (lista [2, 9]), 7 = 7: se agrega y gana la máquina (lista [2, 9, 7]). El bucle se corta: los dos valores restantes nunca se generan.

lista=[2, 9, 7]  ⇒  3 nuˊmeros\text{lista} = [2,\ 9,\ 7] \;\Rightarrow\; 3 \text{ números}

En general, si la máquina acierta en el intento kk la lista tiene kk elementos; si no acierta nunca, tiene 5.

1.dAntes del bucle se hizo intentos = [] y ganador = "Humano". ¿Qué fragmento implementa bien los turnos de la máquina?

Ver desarrollo

A es correcta: range(5) da exactamente 5 vueltas (0 a 4) y el break corta apenas acierta.

B: range(1, 5) da sólo 4 vueltas (1, 2, 3, 4).

C: con intento de 0 a 5 inclusive, while intento <= 5 da 6 vueltas. Tendría que ser while intento < 5.

D: el if quedó fuera del bucle (sangría), así que sólo compara el último intento. Si la máquina acierta en el segundo intento y falla en el quinto, declara ganador al humano; además nunca corta antes.

1.eSi randint elige cada intento al azar y de forma independiente (puede repetir números), ¿cuál es la probabilidad de que gane la máquina? Redondeá a 4 decimales.

Ver desarrollo

En cada intento la máquina acierta con probabilidad 110\frac{1}{10} y falla con 910\frac{9}{10}. El humano gana sólo si fallan los 5 intentos independientes:

P(gana humano)=(910)5=0,59049P(\text{gana humano}) = \left(\frac{9}{10}\right)^5 = 0{,}59049
P(gana maˊquina)=1−0,59049=0,40951≈0,4095P(\text{gana máquina}) = 1 - 0{,}59049 = 0{,}40951 \approx 0{,}4095

Errores típicos: sumar 5⋅110=0,55 \cdot \frac{1}{10} = 0{,}5 (vale sólo si la máquina no repite números) o responder 0,59050{,}5905, que es la probabilidad de que gane el humano.

1.fCon intentos = [3, 5, 1, 4, 1], ¿qué instrucción imprime exactamente Los números fueron: [3, 5, 1, 4, 1]?

Ver desarrollo

B: print separa sus argumentos con un espacio y muestra la lista con su representación [3, 5, 1, 4, 1].

A lanza TypeError: no se puede concatenar str con list. C funciona, pero falta el espacio después de los dos puntos. D desempaqueta la lista e imprime Los números fueron: 3 5 1 4 1, sin corchetes ni comas.

1.gUn alumno lee el número con numero = input("Ingrese un número: ") y compara n == numero. La máquina nunca gana, aunque diga el número correcto. ¿Por qué?

Ver desarrollo

input() siempre devuelve una cadena: si el usuario escribe 5, numero vale "5". randint devuelve un int, y en Python un entero nunca es igual a una cadena: 5 == "5" es False.

Solución: convertir al leer, numero = int(input("Ingrese un número: ")).

Las otras opciones son falsas: randint devuelve int; == compara valores (además, 5.0 == 5 es True); y los tipos de C están al revés.

Guía 1 — Ejercicios en Python · Programación I.