Transforma el pseudo código del juego en python

votos
1

Haga que la computadora adivine un número que el usuario elija entre 1 y 1000 en no más de 10 conjeturas. Esta asignación usa un algoritmo llamado búsqueda binaria. Después de cada conjetura, el algoritmo reduce a la mitad el número de respuestas posibles para buscar. El seudocódigo para el programa completo se da a continuación; su tarea es convertirlo en un programa python en funcionamiento. El programa debe comenzar imprimiendo instrucciones en la pantalla, explicando que el usuario debe elegir un número entre 1 y 1000 y la computadora lo adivinará en no más de 10 intentos. Luego comienza a hacer conjeturas, y después de cada conjetura le pide al usuario su opinión. Se debe indicar al usuario que ingrese -1 si la conjetura debe ser menor, 0 si fue correcto y 1 si es necesario que sea más alto. Cuando el programa adivine correctamente, debe informar cuántas conjeturas se requieren.

Pseudocódigo

- Print instructions to the user  
-Start with high = 1000, low = 1, and tries = 1 
- While high is greater than low   
  - Guess the average of high and low  
  - Ask the user to respond to the guess  
  - Handle the four possible outcomes:  
    - If the guess was right, print a message that tries guesses were required and quit the program
    - If the guess was too high, set high to one less than the guess that was displayed to the user and increment tries  
    - If the guess was too low, set low to one more than the guess that was displayed to the user and increment tries
    - If the user entered an incorrect value, print out the instructions again
- high and low must be equal, so print out the answer and the value of tries

¡Necesito ayuda seria! ¡No entiendo nada de esto en absoluto! Esto es todo lo que tengo

def main(x, nums, low, high):
        input(Enter -1 if the guess needs to be lower, 0 if the guess was right, or 1 if the guess needs to be higher: )
    for i in range (1, 1001):

main()

¡y ni siquiera sé si es correcto!

Publicado el 14/06/2009 a las 04:28
fuente por usuario
En otros idiomas...                            


7 respuestas

votos
4

Obviamente, eres muy nuevo en la programación, y creo que esa es una de las razones de una respuesta retrasada de la comunidad. Es difícil decidir por dónde empezar y cómo guiarte durante todo este ejercicio.

Entonces, antes de obtener una buena respuesta aquí que incluye hacerle entender lo que está sucediendo allí, y guiarlo a usted mismo para la construcción de la solución (idealmente!) Le sugiero que visite esta página para tratar de comprender el problema real.

http://www.openbookproject.net/pybiblio/gasp/course/4-highlow.html

Mientras tanto, mira todas las respuestas en este hilo y sigue editando tu publicación para que sepamos que la estás obteniendo.

Respondida el 14/06/2009 a las 04:37
fuente por usuario

votos
1

Bien, la parte buena de usar Python es que es casi un seudocódigo de todos modos.

Ahora, pensemos en los pasos individuales:

  1. ¿Cómo se obtiene el promedio entre alto y bajo?

  2. ¿Cómo le preguntas al usuario si el contestador es correcto?

  3. ¿Qué aspecto tienen las sentencias "if" en Python, y cómo escribirías el pseudocódigo como declaraciones if?

Aquí hay otra pista: puede ejecutar Python como intérprete y probar declaraciones individuales a lo largo de, así que, por ejemplo, podría hacer

high=23
low=7

luego calcule lo que cree que debería ser el punto medio o medio entre ellos (sugerencia: 15)

Respondida el 14/06/2009 a las 04:42
fuente por usuario

votos
11

¡No entiendo nada de esto en absoluto!

Eso es bastante problemático, pero, bueno, ¡hagamos un paso a la vez! Tu tarea comienza:

Imprimir instrucciones para el usuario

Entonces no entiendes CUALQUIERA de las cosas, dices, entonces eso significa que no entiendes esta parte tampoco. Bien: "el usuario" es la persona que está ejecutando su programa. Las "instrucciones" son frases en inglés que le indican a él o ella qué hacer para jugar el juego, según la siguiente cita de esta tarea excelentemente clara y detallada:

El programa debe comenzar imprimiendo instrucciones en la pantalla, explicando que el usuario debe elegir un número entre 1 y 1000 y la computadora lo adivinará en no más de 10 intentos.

" print" es una instrucción de Python que emite información; por ejemplo, pruebe un programa que contenga solo

print "some information"

para ver cómo funciona OK, ¿pueden editar su respuesta para mostrarnos que han llegado a este punto, para pasar al siguiente? Siéntase libre de comentar aquí con más preguntas si alguna palabra o concepto que estoy usando todavía es demasiado avanzado para usted, ¡y trataré de aclararlo!

Respondida el 14/06/2009 a las 04:43
fuente por usuario

votos
14

Antes de pensar en cómo implementar esto en Python (o en cualquier otro idioma), veamos el pseudocódigo, que parece un plan bastante bueno para resolver el problema.

Supongo que una cosa a la que te puedes atascar es la forma en que el pseudocódigo hace referencia a las variables , como highy low. La forma de entender las variables es considerarlas ranuras para que los valores puedan almacenarse. En un momento dado, una variable tiene algún valor, como el número 5, o una referencia a un archivo abierto. Ese valor se puede invocar en cualquier momento mediante el uso de su nombre, o puede asignársele un nuevo valor, y el valor anterior se olvidará con el nuevo valor en su lugar.

El pseudocódigo hace referencia a tres variables, high, lowy tries. También le dice cuáles deberían ser sus valores iniciales. Después de que se haya ejecutado la segunda línea, esos valores se establecen en 1000, 1 y 1, respectivamente, pero adquieren nuevos valores a medida que el programa avanza.

Otra característica del pseudocódigo es un ciclo condicional y un análisis de caso de la entrada del usuario. Tu traducción del ciclo del pseudocódigo es incorrecta. En su caso, ha creado una nueva variable iy ha ordenado a su programa que ejecute el cuerpo del ciclo con cada valor de i entre 1 y 1000. Obviamente, esto no tiene mucho que ver con el pseudocódigo.

En cambio, lo que desea hacer es repetir el ciclo para siempre, hasta que alguna condición (que cambia en el cuerpo del ciclo) se vuelva falsa. En python, la whiledeclaración hace esto. Si está familiarizado con un ifenunciado, whiletiene el mismo aspecto, pero una vez que el cuerpo está listo, la condición se vuelve a evaluar y el cuerpo se ejecuta nuevamente si todavía es verdadero.

Finalmente, el análisis de casos en el cuerpo del ciclo requiere comparar algo con los valores esperados. Aunque algunos otros lenguajes tienen varias formas de expresar esto, en python solo tenemos if- elif- elsecláusulas.


Aparte de transformar el pseudocódigo en código de trabajo, probablemente sea útil entender qué está haciendo realmente el programa. La clave aquí está en la línea 4, donde el programa adivina el promedio de dos valores. después de eso, el programa actúa sobre qué tan bien funcionó la suposición.

En la primera ejecución del ciclo, con high1000 y low1, el promedio es 500 (en realidad, el promedio es 500.5, pero dado que estamos promediando números enteros, Python supone que queremos que el resultado de la división también sea un número entero ) Obviamente, esa conjetura tiene solo un 0.1% de posibilidades de estar en lo cierto, pero si es incorrecta, se espera que el usuario nos diga si fue demasiado alta o demasiado baja. De cualquier manera, esa respuesta elimina por completo el 50% de las posibles conjeturas.

Si, por ejemplo, el usuario estaba pensando en un número bajo, entonces cuando el programa supuso 500, el usuario le diría al programa que 500 era demasiado alto, y entonces el programa no tendría que adivinar que el número estaba en el rango de 501 a 1000. Eso puede ahorrar mucho trabajo a la computadora.

Para usar esa información, el programa realiza un seguimiento del rango de valores posibles que podría tener el número objetivo. Cuando el número adivinado es demasiado alto, el programa ajusta su límite superior hacia abajo, justo debajo de la suposición, y si la suposición es demasiado baja, el programa ajusta su límite inferior hacia arriba justo por encima de la suposición.

Cuando el programa adivine de nuevo, la conjetura está justo en el medio del rango posible, cortando el rango a la mitad nuevamente. El número de conjeturas posibles pasó de 1000 a 500 originales en una conjetura, a 250 en dos conjeturas. Si el programa tiene mala suerte, y no puede obtenerlo dos (lo cual es bastante probable), en el tercero, solo le quedan 125 números de los que preocuparse. Después de la cuarta suposición, solo 62 números permanecen dentro del rango. Esto continúa, y después de ocho conjeturas, solo quedan 3 números, y el programa intenta el número medio para su novena conjetura. Si eso resulta ser incorrecto, solo queda un número, ¡y el programa lo adivina!

Esta técnica de dividir un rango por la mitad y luego continuar hasta la mitad más cercana se llama bisección y aparece en una amplia gama temas de interés para la informática.


¿Qué tal un CÓDIGO? Como no quiero privarte de la experiencia de aprendizaje, solo te daré algunos fragmentos que podrían ayudarte. Python es un lenguaje diseñado para la exploración interactiva, así que enciende tu intérprete y dale una oportunidad. Voy a publicar ejemplos con las indicaciones que se muestran, en realidad no mecanografiar eso.

Aquí hay un ejemplo usando la whilecláusula:

>>> x = 1000
>>> while x > 1:
...     x = x/2
...     print x
...
500
250
125
62
31
15
7
3
1
>>> x
1

La entrada de la consola del usuario se debe hacer a través de la raw_input()función. Simplemente devuelve lo que escribe el usuario. Esto es un poco más difícil de mostrar. Para simplificar las cosas, después de cada línea de python que requiera entrada, escribiré "Hello World!" (sin las comillas)

>>> raw_input()
Hello World!
'Hello World!'
>>> y = raw_input()
Hello World!
>>> print y
Hello World!
>>> 

¿Qué tal una combinación de conceptos?

>>> myvar = ''
>>> while myvar != 'exit':
...     myvar = raw_input()
...     if myvar == 'apples':
...         print "I like apples"
...     elif myvar == 'bananas':
...         print "I don't like bananas"
...     else:
...         print "I've never eaten", myvar
...
apples
I like apples
mangoes
I've never eaten mangoes
bananas
I don't like bananas
exit
I've never eaten exit
>>> 

Oops. un pequeño error allí. ¡Mira si puedes arreglarlo!

Respondida el 14/06/2009 a las 05:17
fuente por usuario

votos
0

Aquí hay algunos consejos para comenzar:

Promedio = Valor + Valor + Valor [...] / Número de valores; (por ejemplo, ((2 + 5 + 3) / (3))

Muchos lenguajes de programación usan precedencia de operador diferente. Cuando estoy programando, siempre uso paréntesis cuando no estoy seguro de la precedencia del operador. En mi ejemplo anterior, si solo hiciera 2 + 5 + 3/3, el programa haría las operaciones de división antes de la suma, por lo que se evacuaría a 2 + 5 + (3/3) o 2 + 5 + 1 == 7 .

Omita esto para los usuarios de Python / * En segundo lugar: sus primeros programas pueden beneficiarse de la corrección const ( aquí hay una buena explicación de lo que es y por qué es EXTREMADAMENTE una buena práctica). Por favor, lea todo y comprenda por qué debería usar constantes (o lo que sea el equivalente de python). Busque también "números mágicos", que es un área grande donde se usan constantes. * /

Google "Disculpe a mi querida tía Sally" (NOTA: esto solo trata con operadores matemáticos, y mayormente es válido para lenguajes de programación; para un estudio más exhaustivo de la precedencia del operador, busque la documentación de su idioma elegido para la precedencia - también tenga en cuenta que la mayoría de los programas no tienen operadores de potencia incorporados, pero la mayoría de las bibliotecas estándar tienen funciones pow).

Hablando de biblioteca estándar: familiarícese con las funciones estándar de la biblioteca (nunca he usado Python, no sé cómo implementa una SL, pero me sorprendería enormemente si un lenguaje popular no tuviera una SL bien desarrollada). Si no sabe qué es eso y su libro / tutorial no lo tiene, obtenga uno nuevo. Cualquier recurso que no haga referencia a una biblioteca estándar no vale la pena el tiempo.

Por último: si bien esta publicación puede parecer que sé de lo que estoy hablando, todavía estoy en las primeras fases de aprendizaje, al igual que usted. Algunas cosas a las que te gustaría acostumbrarte desde el principio (cuando omití estas partes, ralentizaron mucho mi aprendizaje): el uso de referencias y punteros (Q para comentarios: ¿Python tiene punteros?), La diferencia entre los datos EN una ubicación de memoria y la ubicación real de la memoria (muchas veces, la ubicación del valor en la memoria será más útil que el valor en sí, al menos al escribir estructuras de datos). Especialmente acostumbrarse a la biblioteca estándar; busca funciones de tipo copiar, buscar, etc. útiles en la manipulación de cadenas.

En realidad, al releer tu publicación original, no me di cuenta de que era una tarea de tipo tarea. Si no estás haciendo esto por diversión, probablemente nunca tomes mi consejo. Solo recuerde que la programación puede ser extremadamente divertida, si no la convierte en una tarea ardua, y no se frustre cuando su código no se compile (o ... interprete) u obtenga resultados inesperados, etc.

Respondida el 14/06/2009 a las 05:24
fuente por usuario

votos
1

Bienvenido a Stack Overflow!

El truco aquí es darse cuenta de que su programa Python debe parecerse casi al pseudocódigo.

Primero, intentemos comprender exactamente qué está haciendo el pseudocódigo. Si tuviéramos que interactuar con el programa descrito por el pseudocódigo, se vería algo como esto:

Think of a number between 1 and 1000 and press Enter.
>>> 
Is it 500? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> 1
Is it 750? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> -1
Is it 625? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.

etc.

Cuando pensamos por primera vez en nuestro número, el programa solo sabe que está entre 1 y 1000. Representa este conocimiento al establecer la variable 'baja' en 1 y la variable 'alta' en 1000. Su primera suposición es el promedio de estos números, que es 500.

Después de decirle al programa que nuestro número es mayor que 500, se actualiza el valor de "bajo" a 501. En otras palabras, el programa sabe que nuestro número está entre 501 y 1000. Luego adivina el promedio de 501 y 1000, que es 750. Le decimos que nuestro número es más bajo, por lo que el programa actualiza el valor de 'alto' a 749 y adivina el promedio de 501 y 749 a continuación, y así sucesivamente hasta que acerta o ha reducido el rango posible hasta un solo número (lo que significa que su próxima suposición será correcta).

Así que de vuelta a escribir el programa en Python: básicamente solo traducimos la línea de pseudocódigo para la línea. Por ejemplo, nuestro bucle de programa debería verse exactamente como lo hace en el pseucode:

while high > low:
  # Guess (high + low) / 2 and ask user to respond
  # Handle user response

No hay necesidad de un bucle for como tiene en su código.

Para obtener información, podemos hacer algo como esto:

guess = (high + low) / 2
response = input('Is it ' + str(guess) + '? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.')

Ahora la entrada del usuario se almacena en la variable 'respuesta', y podemos manejar las posibilidades con enunciados como 'si respuesta == -1:' por ejemplo.

Simplemente recuerde imprimir las instrucciones y establecer 'alto' y 'bajo' en sus valores iniciales antes de ingresar al ciclo while y debe estar todo listo.

¡Buena suerte!

Respondida el 14/06/2009 a las 06:59
fuente por usuario

votos
2

No coincide con el psudocode exactamente, pero funciona. lol;)

Sé que esto es un post viejo malvado pero esta es la misma asignación que tengo también. Esto es lo que terminé con:

high = 1000
low = 1
print "Pick a number between 1 and 1000."
print "I will guess your number in 10 tries or less."
print "Or at least i'll try to.  ;)"
print "My first guess is 500."
guess = 500
tries = 0
answer = 1
print "Enter 1 if it's higher."
print "Enter -1 if it's lower."
print "Enter 0 if I guessed it!"
print ""
while (answer != 0):
    answer = int(raw_input("Am I close?"))
    if answer == 1:
        tries = tries + 1
        low = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == -1:
        tries = tries + 1
        high = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == 0:
        tries = tries + 1
        print "Your number is:"
        print guess
        print "Yay! I got it! Number of guesses:"
        print tries
Respondida el 25/09/2010 a las 20:02
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more