[Solucionado][Python] Ingresar número de 4 dígitos

Iniciado por manri98, 4 Noviembre 2016, 15:17 PM

0 Miembros y 1 Visitante están viendo este tema.

manri98

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 (python) [Seleccionar]

def askNumber():
   userNumber = "0"
   isCorrect = False
   while len(userNumber)!=4 and not isCorrect:
       userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
       for i in range(1, len(userNumber)):
           if userNumber[i] == userNumber[i-1]:
               isCorrect = False
           else:
               isCorrect = True
       if userNumber[0] == "0":
           isCorrect = False
   return userNumber

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.
(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco

engel lex

no se que intentas hacer con

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)
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

Cita de: engel lex en  4 Noviembre 2016, 15:30 PM
no se que intentas hacer con

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 (python) [Seleccionar]
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 (python) [Seleccionar]
        if userNumber[0] == "0":
            isCorrect = False

Y ninguno de los dígitos debería repetirse.
Ejemplo-->
    1234 Bien
    7648 Bien
    0123 Mal
    1223 Mal
    9999 Mal
(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco

engel lex

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

1232 estaría mal también. No había pensado en ese caso... 
(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco

engel lex

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

por ejemplo

Código (python) [Seleccionar]
busqueda = "a"
cadena = "hola"

if(busqueda in cadena):
   print busqueda ,"está en", cadena


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 (python) [Seleccionar]
//entrada = raw_int(lo que sea)

if(entrada.isdigit() and int(entrada) >= 1000 and int(entrada) <= 9999):
  print "es un numero entre 1000 y 9999


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

#6
Cita de: manri98 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 (python) [Seleccionar]

def askNumber():
   userNumber = "0"
   isCorrect = False
   while len(userNumber)!=4 and not isCorrect:
       userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
       for i in range(1, len(userNumber)):
           if userNumber[i] == userNumber[i-1]:
               isCorrect = False
           else:
               isCorrect = True
       if userNumber[0] == "0":
           isCorrect = False
   return userNumber

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 (python) [Seleccionar]

def askNumber():
userNumber = "0"
isCorrect = False
while len(userNumber)!=4 or not isCorrect:
userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
if len(set(userNumber)) == 4 and userNumber[0] != "0":
isCorrect = True
else:
isCorrect = False
return userNumber



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 (python) [Seleccionar]

def hayRepeticiones(cadena):
hayRepeticion = False

x = 0
while x < len(cadena) and not hayRepeticion:
y = x+1
while y < len(cadena) and not hayRepeticion:
if cadena[x] == cadena[y]:
hayRepeticion = True
y += 1
x += 1

return hayRepeticion

def askNumber():
userNumber = "0"
while (len(userNumber) != 4 or userNumber[0] == "0") or hayRepeticiones(userNumber): #Mientras sea invalido o haya repeticiones
userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
return userNumber



Espero que te haya servido de ayuda!

Saludos!

manri98

Solucionado. La función count() me vino perfecta, gracias! :D
Dejo aquí el código funcional:
Código (python) [Seleccionar]

def askNumber():
    userNumber = "0"
    isCorrect = False
    while len(userNumber)!=4 or not isCorrect  or userNumber[0] == "0":
        userNumber = raw_input("Please type a 4 digit number between 1000 and 9999, do not repeat any digit: ")
        for i in range(len(userNumber)):
            if userNumber.count(userNumber[i]) > 1:
                isCorrect = False
                break
            else:
                isCorrect = True
    return userNumber
(\/)4|\|r1 98
-Cuantos dálmatas había en la peli?
-101
-por el culo te la hinco

manri98

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 (python) [Seleccionar]

from random import randint

secretNumber = "0"
userNumber = "0"
tries = 7
cows = 0
bulls = 0

def generateNumber():
    secretNumber = str(randint(1, 9))
    for i in range(3):
        x = str(randint(0, 9))
        while x in secretNumber:
            x = str(randint(0, 9))
        secretNumber += x
    return secretNumber
       
def askNumber():
    userNumber = "0"
    isCorrect = False
    while len(userNumber)!=4 or not isCorrect  or userNumber[0] == "0":
        userNumber = raw_input("Type a 4 digit number between 1000 and 9999.\nDo not repeat any digit: ")
        for i in range(len(userNumber)):
            if userNumber.count(userNumber[i]) > 1:
                isCorrect = False
                break
            else:
                isCorrect = True
    return userNumber


print" _________________________"
print"< Welcome to Cows & Bulls >"
print" -------------------------"
print"        \   ^__^"
print"         \  (oo)\_______"
print"            (__)\       )\/\\"
print"                ||----w |"
print"                ||     ||\n"
secretNumber = generateNumber()


while tries>0:
    userNumber = askNumber()
    if userNumber == secretNumber:
        print"*************************************************"
        print"*Congratulations, you guessed the secret number.*"
        print"*************************************************"
        break   

    for i in range (len(secretNumber)):
        if userNumber[i] == secretNumber[i]:
            bulls +=1
        elif userNumber[i] in secretNumber:
            cows +=1

    print "FAIL: %d cows and %d bulls. You still have %d attempts\n" %(cows, bulls, tries-1)
   
    tries -=1
    bulls = 0
    cows = 0   


if tries == 0:
    print "You got out of attempts!\nThe secret number was %d" %int(secretNumber)



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