jueves, 5 de julio de 2018

Booleanos en Python

Reto: Booleanos

Generar aletoriamente un número del 100.000 al 200.000. Si ese número tiene un tres pierdes la partida y si carece de treses entonces has tenido éxito en el juego.



Veamos varias soluciones al juego planteado, unas usan variables booleanas y otras no, unas usan funciones y otras no, unas usan un bucle para recorrer todos los caracteres del número aleatorio y otras no. Con esta casuística de soluciones podemos aprender bastante acerda de este tipo de casos. El ejemplo es muy parecido a la programación que necesitaríamos para determinar si un número es primo o no. En ese caso la idea es suponer que de entrada el número analizado si es primo y hasta que no se encuentre alguno de los anteriores que haga que al dividir entre él de división exacta no podremos descartarlo. Por tanto, será necesario buscar si hay división exacta recorriendo unos cuantos valores previos. Y hasta que no podamos descartar que ninguno de los números previos no da división exacta no podremos afirmar que el número candidato es primo. Aquí sucede lo mismo, hasta que no se analizan los seis dígitos que componen el número aleatorio del juego, no se podrá afirmar que hemos ganado. Solo cuando hemos descartado que todos ellos son distintos de tres entonces es cuando podemos afirmar que hemos ganado.

Método 1

Vamos a jugar a 'me quiere' y 'no me quiere' como si estuviéramos desojando una margarita. Tendremos éxito cuando el número aleatorio entre cien mil y docientos mil no tenga ninguna cifra igual a tres. Si aparece algún tres entonces habremos fracasado en el juego.
Creamos una variable booleana que inicialmente tendrá el valor True. Nos metemos en un condicional if que analiza si existe algún tres en el número aleatorio. Trabajamos con cadenas alfanuméricas para que nos funcione in que busca en el string para ver si localiza algún tres. Si se cumple la condición de que ha encontrado un tres entonces la variable booleana meQuiere se torna en False.
Finalmente nos metemos en otro condicional if que analiza el valor de la variable booleana. Observe que no es necesario poner meQuiere==True, sino que para ver si esta variable es verdadera simplemente se pone la variable booleana ya que en si misma ya nos dirá si es True o False.



import random
x=str(random.randint(100000,200000))
print(x)
meQuiere=True #inicialmente me quiere
if str(3) in x:
  meQuiere=False

if meQuiere:
  print('Me quiere')
else:
  print('No me quiere')


Método 2

Generamos el número aleatorio y lo convertimos en un string. Inicializamos la variable booleana premio como True. Nos metemos en un bucle for que recorre todos los caracteres del número. Si alguno de los caracteres es igual a tres entonces la variable booleana se convierte en False y con break detenemos el bucle.
Al final nos encontramos con otro condicional if que analiza la variable booleana premio. Si es verdadera imprime que hemos ganado y si es falsa entonces habremos perdido.

import random
x=str(random.randint(100000,200000))
print(x)
premio=True #inicializamos la variable booleana como verdadera
for i in x:
  if int(i)==3: 
    premio=False
    break  

if premio:
  print('Has ganado. BIEN!!!!!!')
else:
  print('Has perdido porque ha salido un 3')


Método 3

Los métodos 3, 4 y 5 solo se diferencian en la función ganare.
Disponemos de dos funciones. La función principal se lanza llamándola con la expresión jugar(). Esta primera función no lleva argumentos, por eso dentro de los paréntesis no se escribe nada, pero es necesario ponerlos. Lo primero que hace la función jugar es generar un número aleatorio y convertirlo en string. Dentro de la función nos encontramos con un condicional if que usa como condición una llamada a la otra función que se llama ganare y la pasa un argumento que es el número aleatorio generado en forma de cadena alfanumérica. La función ganare analiza el número entregado y si contiene un tres devuleve False y si no es así devuelve True. Este retorno hace que el condicional de la función jugar actúe de forma que si el resultado es True imprimirá que hemos ganado el juego y en caso contrario nos dice que hemos perdido.
La función ganare analiza si el argumento en forma de cadena contiene un tres.

import random

#Funcion que retorna True cuando no hay ningún tres
def ganare(x):
  for i in x:
    if int(i)==3:
      return False
  return True

def jugar():
  x=str(random.randint(100000,200000))
  if ganare(x):
    print(x,' He ganado. BIEN!!!!!!')
  else:
    print(x,' He perdido porque ha salido un 3 :(')

jugar()


Método 4

Los métodos 3, 4 y 5 solo se diferencian en la función ganare.
En este método la función ganare no tiene un for que recorra todos los caracteres buscando un tres. Directamente lo que hacemos es meternos en un condicional if que pregunta si un tres como string está en x, si la respuesta es positiva retorna un False y en caso contrario retorna un True. Observe que ni siquiera hemos usado else.

import random

def ganare(x):
  if str(3) in x:
      return False
  return True

def jugar():
  x=str(random.randint(100000,200000))
  if ganare(x):
    print(x,' He ganado. BIEN!!!!!!')
  else:
    print(x,' He perdido porque ha salido un 3 :(')

jugar()


Método 5

Los métodos 3, 4 y 5 solo se diferencian en la función ganare.
Aquí si usamos una variable booleana en la función ganare. La variable se llama premio y la inicializamos en True. Si el tres como string se encuentra en el número x entonces la variable booleana se torna en False. Al final la función devuelve el valor que contenga en ese momomento la variable booleana.

import random

#Funcion que retorna True cuando no hay tres
def ganare(x):
  premio=True
  if str(3) in x:
      premio=False
  return premio

def jugar():
  x=str(random.randint(100000,200000))
  if ganare(x):
    print(x,' He ganado. BIEN!!!!!!')
  else:
    print(x,' He perdido porque ha salido un 3 :(')

jugar()


Método 6

En este caso no trabajamos con funciones. Generamos el número aleatorio lo trasnformamos en una cadena alfanumérica. Nos metemos en un bucle for que recorre todos los caracteres. Dentro del bucle tenemos un condicional if que pregunta si el caracter analizado es un tres. En caso afirmativo imprime que hemos perdido y con un break termina el bucle for. En caso contrario se imprime que hemos ganado. Lo sorprendente es la indentación de else, ya que no es la que cabría esperar a la misma altura que el if. Como vemos else está al nivel del for, y funciona. Pero no podría ser de otra forma ya que si la ponemos a la altura del if cada ver que el dígito analizado no fuera un tres nos diría que hemos ganado.

import random
x=str(random.randint(100000,200000))
for i in x:
  if int(i) == 3:
    print(x,' He perdido porque ha salido un 3.')
    break
else:
  print(x,' He ganado. Fiesta!!!')


Método 7

Este método proporciona una solución con pocas líneas de código. Generamos el número aleatorio como un string. Nos metemos en un if que se cuestiona sobre si existe algún tres. En caso afirmativo imprime que hemos ganado y en caso contrario hemos perdido. Una solución rápida y sencilla.

import random
x=str(random.randint(100000,200000))
if '3' in x:
  print(x,'Has perdido')
else:
  print(x,'Has ganado. Felicidades!!!')


Método 8

Definimos la variable texto que inicializamos con la frase 'Has ganado, porque no ha salido ningún tres.'
Nos metemos en un bucle for que recorre las seis posiciones del número aleatorio generado. Dentro del bucle tenemos un condicional que detecta si alguno de los dígitos es un tres. En caso afirmativo se reescribe la frase de la variable texto informando que ha perdido. De esta forma si no se encuentra ningún tres la frase no se reescribe y se anuncia que se ha ganado.

import random
x=str(random.randint(100000,200000))
texto='Has ganado, porque no ha salido ningún tres.'
for i in x:
  if i=='3':
    texto='Lo siento. Has perdido porque ha salido un tres.'
print(x,texto)

1 comentario:

  1. Es un caso de probabilidad, que dará el mismo resultado de esta forma:

    import random
    print('Lose'if random.randint(0,100000)<40951 else'Win')

    ResponderEliminar