Autor
|
Tema: [Solucionado][Python] Ingresar número de 4 dígitos (Leído 6,060 veces)
|
manri98
Desconectado
Mensajes: 24
8086. Odisea de despacio...
|
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: 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.
|
|
« Ú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
|
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)
|
|
|
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
Mensajes: 24
8086. Odisea de despacio...
|
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: 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) 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
|
|
|
En línea
|
(\/)4|\|r1 98 -Cuantos dálmatas había en la peli? -101 -por el culo te la hinco
|
|
|
engel lex
|
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
Mensajes: 24
8086. Odisea de despacio...
|
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
|
usa "in"... te permite saber si un string está presente en otro por ejemplo 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 //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
|
|
« Ú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
Mensajes: 6
|
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: 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()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.. 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!
|
|
« Última modificación: 4 Noviembre 2016, 17:46 pm por natko »
|
En línea
|
|
|
|
manri98
Desconectado
Mensajes: 24
8086. Odisea de despacio...
|
Solucionado. La función count() me vino perfecta, gracias! Dejo aquí el código funcional: 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
|
|
|
En línea
|
(\/)4|\|r1 98 -Cuantos dálmatas había en la peli? -101 -por el culo te la hinco
|
|
|
manri98
Desconectado
Mensajes: 24
8086. Odisea de despacio...
|
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 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)
|
|
|
En línea
|
(\/)4|\|r1 98 -Cuantos dálmatas había en la peli? -101 -por el culo te la hinco
|
|
|
|
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
|
28 Mayo 2009, 08:24 am
por Eliptico
|
|
|
Separar digitos de un numero
Programación C/C++
|
vaXy
|
6
|
36,386
|
1 Diciembre 2012, 16:17 pm
por cypascal
|
|
|
Problema de digitos de un número.
Ejercicios
|
j retirado
|
2
|
8,386
|
21 Agosto 2009, 02:33 am
por Caballero Maldito
|
|
|
Ayuda con número de dígitos.
Programación C/C++
|
Jaraysedal
|
1
|
3,215
|
2 Noviembre 2010, 20:32 pm
por Littlehorse
|
|
|
Digitos de un numero en C
Programación C/C++
|
Dacan
|
6
|
17,824
|
30 Marzo 2013, 12:34 pm
por 85
|
|