jueves, 27 de septiembre de 2018

La leyenda del Ajedrez

A todos nos han contado la famosa leyenda del tablero de ajedrez y los granos de trigo. Se dice que una sabio enseñó a jugar al ajedrez a un rey de la India. Éste en recompensa le prometió darle lo que quisiera y el sabio pidió como recompensa un grano de trigo por la primera casilla del tablero y que por cada casilla adicional fuera doblando el numero de granos que había en la anterior. Los matemáticos del rey después de muchos días de cálculos le informaron que ese numero era tan grande que no había suficiente trigo en el mundo para pagar al sabio.

Para ilustrar el crecimiento geométrico hemos creado un código en Python para calcular ese número. Aquí tenéis el código.

 i=0  
 s=0  
 while i<64:  
  s+=2**i  
  print(i+1,2**i,s)  
  i+=1  
 print('Unos',int(round(s/25000000000000,0)),'millones de toneladas')  
 print('En 2018, la producción mundial fue de 750 millones de toneladas')  

La última línea se he añadido para dar una mejor perspectiva al enorme de numero que tenemos delante.

miércoles, 26 de septiembre de 2018

Histograma en Python

Para hacer un histograma en Python vamos ha utilizar la librería matplotlib y generaremos los valores de manera aleatoria. El código es este:

import matplotlib.pyplot as plt
import random as ran
values=[]
for x in range(1,11):
   values.append(ran.randrange(11))
plt.hist(values, bins=10)
plt.show()
Usando el for vamos a ir generando números aleatorios y metiendo los en values.
Aquí entra la parte de la librería matplotlib, le pedimos que ejecute hist para indicar que queremos hacer un histograma, también le damos el valor de values para indicar con valores queremos trabajar y por ultimo indicamos los bins que determina el numero de columnas que queremos que se divida la información. Lo imprimimos todo y ya está.

Una variación que podemos hacer es que sin que tú hagas nada te genere mas de histograma con este codigo:


import matplotlib.pyplot as plt
import random as ran
def histograma():
    values=[]
    for x in range(1,11):
        values.append(ran.randrange(11))
    #values=[0,0.6,1.4,1.6,2.2,2.5,2.6,3.2,3.5,3.9,4.2,6]
    plt.hist(values, bins=10)
    plt.show()

for x in range(1,6):
    histograma()

Nota: En la mayoría de paginas web que ejecutan Python no sé podrán ver los gráficos en sí. Para ello necesitaras usar un programa mas potente que pueda procesar las librerías.
Si ejecutas este código en algunos editores de código como PyCharm, al importar las librerías no solo tendrás que importarla escribiéndola en el código si no que tendrás que importarla desde el propio editor. Aquí os enseñamos cómo hacerlo: https://www.youtube.com/watch?v=aROm4KYHXLI&feature=youtu.be

lunes, 24 de septiembre de 2018

Adivina el número secreto en Python

Reto: Adivina el número secreto

Se genera un número aleatorio entero entre 1 y 100. El usuario debe adivinar el número secreto, diciendo en cada tirada si es mayor o menor.




Método 1

Importamos la librería random para generar el número aleatorio secreto n. Preguntamos al usuario por el primer número. Se añade int antes del input para convertir su respuesta en un número entero, ya que si esto no se hace se capturaría un string. Nos metemos en un bucle de tipo while donde la condición analiza si el número proporcionado por el usuario es distinto del número secreto. Dentro de bucle creamos un condicional if para el caso en que el número sea mayor o bien sea menor que el número secreto. En cada caso informamos al usuario con un mensaje donde se le pide que de otro número. Fuera del bucle tenemos una última línea de código que imprime un mensaje donde se felicita al usuario por haber adivinado el número secreto n.

import random
n=random.randrange(1,100)
nu=int(input('Dime el número que crees que he elegido: '))
while nu!=n:
    if nu>n:
        nu=int(input('El número es mas pequeño'))
    elif nu<n:
        nu=int(input('El número es mas grande'))
print('Felicidades has adivinado que el número secreto es:',n)


Método 2

En este método hemos añadido un contador c para ir anotando las tiradas que se realizan y al final informar al usuario sobre el número de tiradas necesarias hasta que ha adivinado el número secreto.



import random
n=random.randrange(1,100)
nu=int(input('Dime el número que crees que he elegido '))
c=1
while nu!=n:
  c+=1
  if nu>n:
      nu=int(input('El número es mas pequeño'))
  elif nu<n:
      nu=int(input('El número es mas grande'))
print('Felicidades has adivinado que el número secreto es:',n)
print('Y lo has adivinado en',c,'intentos.')

Progresión geométrica en Python

Reto: Progresión geométrica

Calcular cuantos granos de trigo tendríamos que utilizar si por cada casilla de un tablero de ajedrez pusiéramos un grano en la primera casilla, dos en la segunda, cuatro en la tercera, y así doblando hasta la última.



Este es el caso de la leyenda de los granos de trigo y el tablero de ajedrez.


Método 1

La variable s se inicializa en cero, y contendrá la suma de todos los granos de trigo que se van anotando en cada casilla. Nos metemos en un bucle for que usa la variable i que va entre cero y 64, incluido el cero y excluido el 64. Dentro del bucle calculamos el número de granos de la casilla i-ésima elevando al cuadrado, y esto se va acumulando en la variable s que es la suma de todos ellos. Se imprime el cómputo por cada casilla y fuera del bucle imprimimos nuevamente el resultado final en notación científica. Observe que hemos separado en dos líneas impresas usando /n. La notación científica se puede implementar usando la e minúscula o la E mayúscula.

s=0
for i in range(8*8):
  s+=2**i
  print(i+1,2**i,s)
print("En notación científica es %e,\n y el total es: %E granos de trigo." % (2**i,s))


Método 2

En este caso usamos un bucle de tipo while. Al final hacemos una estimación de que en un kilo de trigo hay 25.000 granos y con ella calculamos redondeando cuantos millones de toneladas serían necesarios, comparándolo con la producción mundial.

i=0
s=0
while i<64:
  s+=2**i
  print(i+1,2**i,s)
  i+=1
print('Unos',int(round(s/25000000000000,0)),'millones de toneladas')
print('En 2018, la producción mundial fue de 750 millones de toneladas')