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.
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)
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:
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
1223 está mal pero 1232 esta mal o bien
1232 estaría mal también. No había pensado en ese caso...
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
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:
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!
Solucionado. La función count() me vino perfecta, gracias! :D
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
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:
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)