elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Solucionado][Python] Ingresar número de 4 dígitos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado][Python] Ingresar número de 4 dígitos  (Leído 6,060 veces)
manri98

Desconectado Desconectado

Mensajes: 24


8086. Odisea de despacio...


Ver Perfil
[Solucionado][Python] Ingresar número de 4 dígitos
« en: 4 Noviembre 2016, 15:17 pm »

Buenas tardes, tengo esta duda y os la presento para pediros ayuda.
Desde la facultad me han mandado hacer el juego de Cows and Bulls en Python.
Un requisito a implementar es que el usuario debe introducir un número de 4 dígitos entre el 1000 y el 9999, además no puede repetirse ninguno de ellos, mientras no se cumplan esas condiciones el programa pedirá que ingreses un numero nuevo. El número debo guardarse como un string.
Esto es lo que hice:
Código
  1. def askNumber():
  2.    userNumber = "0"
  3.    isCorrect = False
  4.    while len(userNumber)!=4 and not isCorrect:
  5.        userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
  6.        for i in range(1, len(userNumber)):
  7.            if userNumber[i] == userNumber[i-1]:
  8.                isCorrect = False
  9.            else:
  10.                isCorrect = True
  11.        if userNumber[0] == "0":
  12.            isCorrect = False
  13.    return userNumber
  14.  
El problema viene cuando por ejemplo introduzco "1223". isCorrect se vuelve False cuando compara los 2 doses pero se vuelve True al final del for. ¿Cómo podría hacer para que esto no sucediese? ¿Si introdujese un "break" entre las líneas 8 y 9 actuaría en el for o en while?
Gracias de antemano.


« Última modificación: 8 Noviembre 2016, 13:06 pm por manri98 » En línea

(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [Python] Ingresar número de 4 dígitos
« Respuesta #1 en: 4 Noviembre 2016, 15:30 pm »

no se que intentas hacer con

Código:
userNumber[i] == userNumber[i-1]:

pero para este tipo de problemas es más estetico un do-while

si usas break se aplicacrá dentro del ciclo donde esté....


exactamente que necesitas hacer a demás de ver que tenga 4 digitos? (cosa que si tienes correcta, pero no comprobaste si el primer digito es 1 y si son numeros)


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
manri98

Desconectado Desconectado

Mensajes: 24


8086. Odisea de despacio...


Ver Perfil
Re: [Python] Ingresar número de 4 dígitos
« Respuesta #2 en: 4 Noviembre 2016, 15:58 pm »

no se que intentas hacer con

Código:
userNumber[i] == userNumber[i-1]:

pero para este tipo de problemas es más estetico un do-while

si usas break se aplicacrá dentro del ciclo donde esté....


exactamente que necesitas hacer a demás de ver que tenga 4 dígitos? (cosa que si tienes correcta, pero no comprobaste si el primer dígito es 1 y si son números)
Es cierto que no compruebo si son números, pero para este ejercicio no es necesario comprobarlo, se entiende que el usuario sólo introducirá números.
Con esto:
Código
  1. userNumber[i] == userNumber[i-1]:
lo que hago es asegurarme de que dentro de userNumber no haya dos números iguales.
Además de que tenga 4 dígitos, el numero no puede empezar en "0"(lo compruebo después del for)
Código
  1.        if userNumber[0] == "0":
  2.            isCorrect = False
Y ninguno de los dígitos debería repetirse.
Ejemplo-->
    1234 Bien
    7648 Bien
    0123 Mal
    1223 Mal
    9999 Mal
En línea

(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [Python] Ingresar número de 4 dígitos
« Respuesta #3 en: 4 Noviembre 2016, 16:05 pm »

1223 está mal pero 1232 esta mal o bien
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
manri98

Desconectado Desconectado

Mensajes: 24


8086. Odisea de despacio...


Ver Perfil
Re: [Python] Ingresar número de 4 dígitos
« Respuesta #4 en: 4 Noviembre 2016, 16:07 pm »

1232 estaría mal también. No había pensado en ese caso... 
En línea

(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [Python] Ingresar número de 4 dígitos
« Respuesta #5 en: 4 Noviembre 2016, 16:15 pm »

usa "in"... te permite saber si un string está presente en otro

por ejemplo

Código
  1. busqueda = "a"
  2. cadena = "hola"
  3.  
  4. if(busqueda in cadena):
  5.    print busqueda ,"está en", cadena
  6.  

te recomiendo que para la verificación  conviertas el string, ya que es más simple, usando ".isdigit()" para comprobar que sea numero, y conviertiendo con int() en un solo if haces todo

Código
  1. //entrada = raw_int(lo que sea)
  2.  
  3. if(entrada.isdigit() and int(entrada) >= 1000 and int(entrada) <= 9999):
  4.  print "es un numero entre 1000 y 9999
  5.  
  6.  
  7.  
« Última modificación: 4 Noviembre 2016, 16:23 pm por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
natko

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: [Python] Ingresar número de 4 dígitos
« Respuesta #6 en: 4 Noviembre 2016, 17:44 pm »

Buenas tardes, tengo esta duda y os la presento para pediros ayuda.
Desde la facultad me han mandado hacer el juego de Cows and Bulls en Python.
Un requisito a implementar es que el usuario debe introducir un número de 4 dígitos entre el 1000 y el 9999, además no puede repetirse ninguno de ellos, mientras no se cumplan esas condiciones el programa pedirá que ingreses un numero nuevo. El número debo guardarse como un string.
Esto es lo que hice:
Código
  1. def askNumber():
  2.    userNumber = "0"
  3.    isCorrect = False
  4.    while len(userNumber)!=4 and not isCorrect:
  5.        userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
  6.        for i in range(1, len(userNumber)):
  7.            if userNumber[i] == userNumber[i-1]:
  8.                isCorrect = False
  9.            else:
  10.                isCorrect = True
  11.        if userNumber[0] == "0":
  12.            isCorrect = False
  13.    return userNumber
  14.  
El problema viene cuando por ejemplo introduzco "1223". isCorrect se vuelve False cuando compara los 2 doses pero se vuelve True al final del for. ¿Cómo podría hacer para que esto no sucediese? ¿Si introdujese un "break" entre las líneas 8 y 9 actuaría en el for o en while?
Gracias de antemano.


Hay muchas formas de resolverlo.. Puedes pasarlo a int, o en string utilizar la funcion string.count(caracter), que devuelve cuantas veces se encuentra 'caracter' en 'string'.. Tambien puedes utilizar la funcion 'set' que al pasarle un arreglo esta elimina todas las repeticiones y devuelve ese arreglo sin valores repetidos pero los valores desordenados, igualmente no actua sobre tu arreglo, sino que crea otro y lo devuelve, por eso mismo podemos hacer esto..

Utilizando set()
Código
  1. def askNumber():
  2. userNumber = "0"
  3. isCorrect = False
  4. while len(userNumber)!=4 or not isCorrect:
  5. userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
  6. if len(set(userNumber)) == 4 and userNumber[0] != "0":
  7. isCorrect = True
  8. else:
  9. isCorrect = False
  10. return userNumber
  11.  


Ahora si no puedes utilizar funciones adicionales como yo en la facultad jaja, puedes hacer un while anidado a otro para comprobar si hay repeticion.. Algo asi..

Código
  1. def hayRepeticiones(cadena):
  2. hayRepeticion = False
  3.  
  4. x = 0
  5. while x < len(cadena) and not hayRepeticion:
  6. y = x+1
  7. while y < len(cadena) and not hayRepeticion:
  8. if cadena[x] == cadena[y]:
  9. hayRepeticion = True
  10. y += 1
  11. x += 1
  12.  
  13. return hayRepeticion
  14.  
  15. def askNumber():
  16. userNumber = "0"
  17. while (len(userNumber) != 4 or userNumber[0] == "0") or hayRepeticiones(userNumber): #Mientras sea invalido o haya repeticiones
  18. userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
  19. return userNumber
  20.  


Espero que te haya servido de ayuda!

Saludos!
« Última modificación: 4 Noviembre 2016, 17:46 pm por natko » En línea

manri98

Desconectado Desconectado

Mensajes: 24


8086. Odisea de despacio...


Ver Perfil
Re: [Python] Ingresar número de 4 dígitos
« Respuesta #7 en: 8 Noviembre 2016, 12:46 pm »

Solucionado. La función count() me vino perfecta, gracias! :D
Dejo aquí el código funcional:
Código
  1. def askNumber():
  2.    userNumber = "0"
  3.    isCorrect = False
  4.    while len(userNumber)!=4 or not isCorrect  or userNumber[0] == "0":
  5.        userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
  6.        for i in range(len(userNumber)):
  7.            if userNumber.count(userNumber[i]) > 1:
  8.                isCorrect = False
  9.                break
  10.            else:
  11.                isCorrect = True
  12.    return userNumber
  13.  
En línea

(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco
manri98

Desconectado Desconectado

Mensajes: 24


8086. Odisea de despacio...


Ver Perfil
Re: [Solucionado][Python] Ingresar número de 4 dígitos
« Respuesta #8 en: 8 Noviembre 2016, 14:45 pm »

Ya que la duda está resuelta os dejo aquí también el código de Cows and Bulls por si a alguien le resultase de interés,quiere mejorarlo o encuentra algún fallo, que siempre los hay :silbar:
Código
  1. from random import randint
  2.  
  3. secretNumber = "0"
  4. userNumber = "0"
  5. tries = 7
  6. cows = 0
  7. bulls = 0
  8.  
  9. def generateNumber():
  10.    secretNumber = str(randint(1, 9))
  11.    for i in range(3):
  12.        x = str(randint(0, 9))
  13.        while x in secretNumber:
  14.            x = str(randint(0, 9))
  15.        secretNumber += x
  16.    return secretNumber
  17.  
  18. def askNumber():
  19.    userNumber = "0"
  20.    isCorrect = False
  21.    while len(userNumber)!=4 or not isCorrect  or userNumber[0] == "0":
  22.        userNumber = raw_input("Type a 4 digit number between 1000 and 9999.\nDo not repeat any digit: ")
  23.        for i in range(len(userNumber)):
  24.            if userNumber.count(userNumber[i]) > 1:
  25.                isCorrect = False
  26.                break
  27.            else:
  28.                isCorrect = True
  29.    return userNumber
  30.  
  31.  
  32. print" _________________________"
  33. print"< Welcome to Cows & Bulls >"
  34. print" -------------------------"
  35. print"        \  ^__^"
  36. print"         \ (oo)\_______"
  37. print"            (__)\      )\/\\"
  38. print"                ||----w |"
  39. print"                ||     ||\n"
  40. secretNumber = generateNumber()
  41.  
  42.  
  43. while tries>0:
  44.    userNumber = askNumber()
  45.    if userNumber == secretNumber:
  46.        print"*************************************************"
  47.        print"*Congratulations, you guessed the secret number.*"
  48.        print"*************************************************"
  49.        break    
  50.  
  51.    for i in range (len(secretNumber)):
  52.        if userNumber[i] == secretNumber[i]:
  53.            bulls +=1
  54.        elif userNumber[i] in secretNumber:
  55.            cows +=1
  56.  
  57.    print "FAIL: %d cows and %d bulls. You still have %d attempts\n" %(cows, bulls, tries-1)
  58.  
  59.    tries -=1
  60.    bulls = 0
  61.    cows = 0  
  62.  
  63.  
  64. if tries == 0:
  65.    print "You got out of attempts!\nThe secret number was %d" %int(secretNumber)
  66.  
  67.  
  68.  
  69.  
En línea

(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
necesito saber como ingresar 1 nº entero >0 y <=100 luego contar sus digitos.... « 1 2 »
Ejercicios
dpunisher03 18 17,123 Último mensaje 28 Mayo 2009, 08:24 am
por Eliptico
Separar digitos de un numero
Programación C/C++
vaXy 6 36,386 Último mensaje 1 Diciembre 2012, 16:17 pm
por cypascal
Problema de digitos de un número.
Ejercicios
j retirado 2 8,386 Último mensaje 21 Agosto 2009, 02:33 am
por Caballero Maldito
Ayuda con número de dígitos.
Programación C/C++
Jaraysedal 1 3,215 Último mensaje 2 Noviembre 2010, 20:32 pm
por Littlehorse
Digitos de un numero en C
Programación C/C++
Dacan 6 17,824 Último mensaje 30 Marzo 2013, 12:34 pm
por 85
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines