Foros del Web » Programando para Internet » Python »

Randomizar preguntas y opciones de respuesta

Estas en el tema de Randomizar preguntas y opciones de respuesta en el foro de Python en Foros del Web. Estoy trabado en otro de esos juegos de práctica que me gusta hacer para ver como manejo algunas cosas. Este en teoría se me hacía ...
  #1 (permalink)  
Antiguo 04/05/2012, 15:08
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Pregunta Randomizar preguntas y opciones de respuesta

Estoy trabado en otro de esos juegos de práctica que me gusta hacer para ver como manejo algunas cosas. Este en teoría se me hacía simple, un juego que lanza preguntas de lógica y 3 posibles respuestas, el usuario elige una y pasa a la siguiente pregunta. Luego de 5 preguntas se muestran las preguntas con las respuestas correctas.

Mi problema es que, anduve tratando de hacer que las preguntas se lanzaran aleatoriamente junto con sus respectivas opciones de respuesta... cosa que al final ha terminado de enredarme completamente.

Antes lo que hacía era:

pregunta1 = "pregunta"
respuesta1 = ["respuestas"...]
print pregunta 1, respuesta1

y comprobaba.

Pero eso no me sirve si quiero randomizar. Estoy seguro de que debe ser con diccionarios pero no logro hacerme la idea, no logro ver la respuesta según entiendo los diccionarios relacionan un valor a una clave, pero solo a una ¿Entonces como le doy más de una opción?

No quiero que me hagan el programa, pero me gustaría ver ideas a ver si me refresco un poco y le consigo la vuelta al programa jaja

Gracias como siempre por adelantado.
  #2 (permalink)  
Antiguo 04/05/2012, 16:20
zz_sioux
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Randomizar preguntas y opciones de respuesta

deberías estudiar el modulo random, y los métodos de los diccionarios,

import random

a = {'a':1,'b':2,'c':3,'d':4,'e':5}

claves = a.keys() # devuelve las claves

azar = random.choice(claves) #ya que necesita una secuencia

print a[azar]

############

no necesariamente una sola clave puedes hacer

diccionario = {'clave1':[n11,n12,n13],'clave2':[n21,n22,n23]}
y luego eliges con choice

Última edición por zz_sioux; 04/05/2012 a las 16:29
  #3 (permalink)  
Antiguo 04/05/2012, 17:50
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Randomizar preguntas y opciones de respuesta

Ok voy entendiendo, no es por joder pero no conocerás algún artículo que hable al respecto? Si es en español genial, no se mucho inglés pero ahí veré. Gracias por responder
  #4 (permalink)  
Antiguo 04/05/2012, 18:52
zz_sioux
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Randomizar preguntas y opciones de respuesta

Chequea la documentación que viene con el instalador de python, ahí están los módulos, sus clases y métodos, y revisa también un libro llamado "python para todos" http://mundogeek.net/tutorial-python/
  #5 (permalink)  
Antiguo 05/05/2012, 17:22
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Randomizar preguntas y opciones de respuesta

Ok perfecto estuve leyendo y más o menos entiendo el chiste de todo esto. La cosa es que cuando imprimo me imprime las claves pero no el valor... osea, me imprime las opciones pero no la pregunta xD...

No manejo bien los diccionarios aunque ya se como randomizarlos de cierta forma, este es el código que escribí para probar un poco:

Código Python:
Ver original
  1. import random
  2.  
  3. diccionario = {'Cuanto es 1+1':('a: 2','b: 5','c: 8'),'Tu mama te quiere?':['a: si', 'b: no', 'c: tal vez']}
  4. claves = diccionario.keys()
  5. azar = random.choice(claves)
  6. print diccionario[azar]

una total tontería pero solo necesito entender mejor el funcionamiento.
  #6 (permalink)  
Antiguo 05/05/2012, 18:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Randomizar preguntas y opciones de respuesta

Cita:
Iniciado por nanotime Ver Mensaje
Ok perfecto estuve leyendo y más o menos entiendo el chiste de todo esto. La cosa es que cuando imprimo me imprime las claves pero no el valor... osea, me imprime las opciones pero no la pregunta xD...

No manejo bien los diccionarios aunque ya se como randomizarlos de cierta forma, este es el código que escribí para probar un poco:

Código Python:
Ver original
  1. import random
  2.  
  3. diccionario = {'Cuanto es 1+1':('a: 2','b: 5','c: 8'),'Tu mama te quiere?':['a: si', 'b: no', 'c: tal vez']}
  4. claves = diccionario.keys()
  5. azar = random.choice(claves)
  6. print diccionario[azar]

una total tontería pero solo necesito entender mejor el funcionamiento.
Definitivamente, parece que lo estas copiando y pegando código (lo cual es una mala practica). Intenta leer sobre diccionarios por la verdad estas muy cerca de lograr lo que buscas.
  #7 (permalink)  
Antiguo 05/05/2012, 20:33
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Randomizar preguntas y opciones de respuesta

Sip copié el código para probar como funcionaba y traté algunas cosas pero no consigo mucho sobre diccionarios, o al menos no se como buscar correctamente. Algunas cosas en python para todos y algo en la wiki de python. Tocará buscar un poco más.
  #8 (permalink)  
Antiguo 06/05/2012, 15:25
zz_sioux
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Randomizar preguntas y opciones de respuesta

La confusión puede venir en que el método choice no elige un clave/valor del diccionario porque solo actúa con una secuencia, entonces allí esta el método keys() que nos devuelve todas las claves de un diccionario en una lista, luego a esta lista le aplicas el método choice, y luego debes buscar con la clave al azar su valor en el dic, asi

Código Python:
Ver original
  1. import random
  2.  
  3. diccionario = {'Cuanto es 1+1':('a: 2','b: 5','c: 8'),'Tu mama te quiere?':['a: si', 'b: no', 'c: tal vez']}
  4.  
  5. claves = diccionario.keys()  # Ahora claves tiene el valor = ['Cuanto es 1+1','Tu mama te quiere?']
  6.  
  7. clavealazar = random.choice(claves) # clavealazar tendrá alguna de las dos claves, por ejem 'Tu mama te quiere?'
  8.  
  9. print diccionario[clavealazar]
  10.  
  11. >>>  ['a: si', 'b: no', 'c: tal vez']
  #9 (permalink)  
Antiguo 09/05/2012, 12:28
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Randomizar preguntas y opciones de respuesta

Claro, llevo leyendo un poco algunas cosas pero lo que necesito no es solo randomizar e imprimir las opciones sino el paquete de preguntas + opciones. Conseguí algo que quizá pueda usar, iteritems() pero necesito seguir leyendo a ver que mas puedo implementar.

La idea es que me lance algo como:

Tu mamá te quiere?

a: si
b: no
c: tal vez

elija una de las opciones a/b/c:

Pero mi problema como tal es lograr imprimir tanto la clave como el valor de forma que concuerden y que en cada corrida el orden de las preguntas/opciones sea aleatorio.
  #10 (permalink)  
Antiguo 09/05/2012, 16:25
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Randomizar preguntas y opciones de respuesta

Esto se puede modelar muy bien con clases.

De hecho solo por diversión implemente las clases Opcion, Pregunta, Opciones y Preguntas.

Si hay que escribir mucho código, pero creo que mucho te lo puede autogenerar el editor.

Código Python:
Ver original
  1. from random import shuffle
  2.  
  3. class Opcion:
  4.     def __init__(self, opcion, respuesta, es_valido=False):
  5.         self.opcion = opcion
  6.         self.respuesta = respuesta
  7.         self.es_valido = es_valido
  8.  
  9.     def __eq__(self, other):
  10.         if self is other:
  11.             return True
  12.         if other is None:
  13.             return False
  14.         if not isinstance(other, Opcion):
  15.             return False
  16.         return other.opcion == self.opcion
  17.  
  18.     def __cmp__(self, other):
  19.         if self.__eq__(other):
  20.             return 0
  21.         if not isinstance(other, Opcion):
  22.             return 1
  23.         return cmp(other.opcion, self.opcion)
  24.  
  25.     def __hash__(self):
  26.         return hash(self.opcion)
  27.  
  28.     def __str__(self):
  29.         return "%s) %s" % (self.opcion, self.respuesta)
  30.  
  31. class Opciones:
  32.     def __init__(self):
  33.         self.opciones = set()
  34.  
  35.     def agregar(self, opcion):
  36.         self.opciones.add(opcion)
  37.  
  38.     def borrar(self, opcion):
  39.         self.opciones.pop(opcion)
  40.  
  41.     def limpiar(self):
  42.         self.opciones = set()
  43.  
  44.     def __iter__(self):
  45.         for opcion in self.opciones:
  46.             yield opcion
  47.  
  48.     def __str__(self):
  49.         return '\n'.join(str(opcion) for opcion in sorted(self.opciones, reverse=True))
  50.            
  51.  
  52. class Pregunta:
  53.     def __init__(self, pregunta, opciones):
  54.         self.pregunta = pregunta
  55.         self.opciones = opciones
  56.  
  57.     def es_correcto(self, opcion):
  58.         for opcion_ in self.opciones:
  59.             if opcion == opcion_.opcion and opcion_.es_valido:
  60.                 return True
  61.         return False
  62.  
  63.     def __str__(self):
  64.         return "%s\n%s" % (self.pregunta, self.opciones)
  65.  
  66. class Preguntas:
  67.     def __init__(self):
  68.         self.preguntas = set()
  69.  
  70.     def agregar(self, pregunta):
  71.         self.preguntas.add(pregunta)
  72.  
  73.     def borrar(self, pregunta):
  74.         self.preguntas.pop(pregunta)
  75.  
  76.     def limpiar(self):
  77.         self.preguntas = set()
  78.  
  79.     def __iter__(self):
  80.         aleatorio = sorted(self.preguntas)
  81.         shuffle(aleatorio)
  82.         for pregunta in aleatorio:
  83.             yield pregunta
  84.        
  85.     def __str__(self):
  86.         return '\n'.join(pregunta for pregunta in sorted(self.preguntas))
  87.  
  88. preguntas = Preguntas()
  89.  
  90. opciones = Opciones()
  91. opciones.agregar(Opcion("a", "Azul", es_valido=True))
  92. opciones.agregar(Opcion("b", "Verde"))
  93. opciones.agregar(Opcion("c", "Rojo"))
  94. pregunta = Pregunta("De que color es el cielo?", opciones)
  95. preguntas.agregar(pregunta)
  96.  
  97. opciones = Opciones()
  98. opciones.agregar(Opcion("a", "6"))
  99. opciones.agregar(Opcion("b", "5", es_valido=True))
  100. opciones.agregar(Opcion("c", "4"))
  101. pregunta = Pregunta("Cuantos dedos regularmente tiene una mano?", opciones)
  102. preguntas.agregar(pregunta)
  103.  
  104. opciones = Opciones()
  105. opciones.agregar(Opcion("a", "No"))
  106. opciones.agregar(Opcion("b", "Si", es_valido=True))
  107. opciones.agregar(Opcion("c", "Solo en el dia"))
  108. pregunta = Pregunta("Es el sol una estrella?", opciones)
  109. preguntas.agregar(pregunta)
  110.  
  111. for pregunta in preguntas:
  112.     print pregunta
  113.     respuesta = raw_input()
  114.     if pregunta.es_correcto(respuesta):
  115.         print "Correcto"
  116.     else:
  117.         print "Incorrecto"
  #11 (permalink)  
Antiguo 11/05/2012, 12:30
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Randomizar preguntas y opciones de respuesta

Wow, queda bastante claro, o bueno entendible. No comprendo bien que hace cada una de las funciones en las clases porque solo conocía __init__ pero ahora toca investigar eso.

Tampoco conocía la palabra reservada yield ni atributos como add y pop, imagino que debe existir documentación para eso así que me pongo a buscar. De verdad gracias.
  #12 (permalink)  
Antiguo 12/05/2012, 13:39
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Randomizar preguntas y opciones de respuesta

Hay algunas cosas de las cuales no logro conseguir documentación, esas funciones __hash__ __eq__ __cmp__ y __str__ quizá porque no sepa como buscarlas exactamente... al menos str puedo comprenderla pero las demás no sé que hacen exactamente; alguien puede facilitarme una lista o cualquier cosa que aclare un poco la funcionalidad de (valga la redundancia) esas funciones?
  #13 (permalink)  
Antiguo 12/05/2012, 15:09
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Randomizar preguntas y opciones de respuesta

__hash__, __eq__, __cmp__.

Es muy raro que algo no este documentado en python.
  #14 (permalink)  
Antiguo 12/05/2012, 17:18
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Randomizar preguntas y opciones de respuesta

No no, no es que no esté documentado, es que no se como buscarlo, eso es todo u.u

Etiquetas: gui, ide, opciones, preguntas, programa, respuesta, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:42.