El juego “Generala” en Python


No me gusta hacerle la tarea a la gente… pero estoy suscrito a Google Alert y me llegan las cosas de Python y hoy me puse a revisar y vi este interesante programa que le mandaron a hacer a un flojo… de verdad que yo pienso que soy flojo para lo que no me gusta hacer… pero si usted estudia programación y tiene pereza de hacer un programa tan simple de verdad déjeme decirle que se equivoco de carrera…

Hoy por ejemplo tuve que implementar 2 módulos en ODOO y extraer datos de unos archivos KIU y de verdad no me seria nada agradable si no me gustara la programación… ademas de instalar un FTP seguro :D… es dura la vida del programador y te tiene que gustar pasar horas intentando solucionar tus problemas de código o el de otros programadores… Si te gusta aprender e investigar y ademas intentas correr tus programas bienvenido al Club… no hay nada malo en equivocarse yo por ejemplo estudie Ing. Química y ahora soy programador, me gusta lo que hago y pagan bien 😀

Manos a la obra, el enunciado dice así:

El juego “Generala” consiste en tirar cinco dados y establecer el puntaje de la jugada. De las posibles, la escalera se da cuando suceden algunas de las tres progresiones: 1-2-3-4-5, 2-3-4-5-6 y 3-4-5-6-1. Realice un programa que tire los 5 dados al azar y determine si se produjo una escalera.

Es un poco sencillo si conoces las estructuras de python, quizá se pueda hacer mejor que lo que hice pero esto lo hice en 10 minutos aproximadamente junto con el otro código 😀

Primer código resolviendo la tarea :S

# -*- coding: utf-8 -*-
import random
###   El juego "Generala" consiste en tirar cinco dados y establecer el puntaje de la
###   jugada. De las posibles, la escalera se da cuando suceden algunas de las tres progresiones: 1-2-3-4-
###   5, 2-3-4-5-6 y 3-4-5-6-1. Realice un programa que tire los 5 dados al azar y determine si se produjo
###   una escalera. 



Iteraciones = 0 
Ganaste = 0
while Ganaste != 1000:
    Lista_dados=[]
    dado_1= random.randrange(1,7)
    Lista_dados.append(dado_1)
  
    dado_2= random.randrange(1,7)
    Lista_dados.append(dado_2)
  
    dado_3= random.randrange(1,7)
    Lista_dados.append(dado_3)
  
    dado_4= random.randrange(1,7)
    Lista_dados.append(dado_4)
  
    dado_5= random.randrange(1,7)
    Lista_dados.append(dado_5)
    
    Lista_dados.sort()
    
    
    if ( Lista_dados == [1, 2, 3, 4, 5] ) or ( Lista_dados == [ 2, 3, 4, 5,6] ) or ( Lista_dados == [1, 3, 4, 5, 6] ):
          Iteraciones +=1
          print "Ganaste en: ", Iteraciones, "Lanzadas"
          print Lista_dados

          Ganaste += 1000
          
          
    else:
          Iteraciones +=1
          print "Sigue intentando solo son: ", Iteraciones, "Lanzadas"

      

Prueba el código y veras la salida, explico este brevemente el otro no :S

Importamos Random para agregar azar al código :D, creamos un bucle while que se ejecutara hasta que Ganaste sea diferente  a 1 o haya 1 ganador, lanzamos los dados desde 1 a 6, recuerda que range no toma el ultimo numero, al final de los dados los sorteamos por defecto de menor a mayor, y creamos 1 if, si los dados aparecen como en alguna de las listas ganadoras, agregamos a ganaste y se rompe el bucle, ademas agregamos 1 a iteraciones y escribimos ganaste en X iteraciones e imprimimos la lista ganadora, esto se hace hasta que Ganaste sea 1 o haya 1 ganador si no se agrega 1 a iteraciones, se muestra un mensaje de consolación y se reanuda el Bucle.. fácil verdad

Ahora como soy ocioso y me gusta pensar y tratar de plasmar mis ideas en código, quería saber cual es la mas alta probabilidad de ganar es decir si lanzo los dados x veces cuantas veces ganare en X lanzadas, pero como mi pensamiento estaba algo no explicito cree una lista con las 10 iteraciones mas comunes en ganar este es el resultado:

# -*- coding: utf-8 -*-
from collections import Counter, OrderedDict
from prettytable import PrettyTable

import random
###   El juego "Generala" consiste en tirar cinco dados y establecer el puntaje de la
###   jugada. De las posibles, la escalera se da cuando suceden algunas de las tres progresiones: 1-2-3-4-
###   5, 2-3-4-5-6 y 3-4-5-6-1. Realice un programa que tire los 5 dados al azar y determine si se produjo
###   una escalera. 


Lista_ganadas=[]
iteraciones_total = 5000
for lanzada in range(1,iteraciones_total):
  Ganaste = 0
  Iteraciones = 0
  while Ganaste != 1:
    Lista_dados=[]
    dado_1= random.randrange(1,7)
    Lista_dados.append(dado_1)
  
    dado_2= random.randrange(1,7)
    Lista_dados.append(dado_2)
  
    dado_3= random.randrange(1,7)
    Lista_dados.append(dado_3)
  
    dado_4= random.randrange(1,7)
    Lista_dados.append(dado_4)
  
    dado_5= random.randrange(1,7)
    Lista_dados.append(dado_5)
    
    Lista_dados.sort()
    
    
    if ( Lista_dados == [1, 2, 3, 4, 5] ) or ( Lista_dados == [ 2, 3, 4, 5,6] ) or ( Lista_dados == [1, 3, 4, 5, 6] ):
          print "Ganaste en: ", lanzada, "Lanzadas"
          print Lista_dados
          Ganaste += 1
          Iteraciones += 1
          Lista_ganadas.append(Iteraciones)

          
    else:
          print "Sigue intentando solo son: ", lanzada, "Lanzadas"
          Iteraciones += 1
    
      
c = Counter(Lista_ganadas)
mas_comunes=  c.most_common()[:10]  

print "mas_comunes",mas_comunes
primer = mas_comunes[0][1]

numero_de_repeticiones = len(mas_comunes)

porcentajes = []
iteracion_ganada = []
for repeticion in range(0,numero_de_repeticiones):
    x = mas_comunes[repeticion][1]
    porentaje_de_iteraciones_total = float(x * 100.0000/ iteraciones_total)
    porcentajes.append(porentaje_de_iteraciones_total)
    iteracion_win = mas_comunes[repeticion][0]
    iteracion_ganada.append(iteracion_win)

    


table = PrettyTable(["iteracion_ganada", "porcentaje"])
i = 0
for repeticion in iteracion_ganada:
    
    table.add_row([iteracion_ganada[i], porcentajes[i]] )
    i += 1

print table


El resultado es algo como esto 😀

+------------------+-------------+
| iteracion_ganada | porcentajes |
+------------------+-------------+
|        1         |     4.88    |
|        2         |     4.54    |
|        4         |     4.1     |
|        3         |     3.98    |
|        7         |     3.74    |
|        5         |     3.72    |
|        9         |     3.56    |
|        6         |     3.26    |
|        11        |     2.96    |
|        10        |     2.88    |
+------------------+-------------+

Dios les Bendiga y recuerden si nos gusta lo que trabajamos no podemos llamarle trabajo 😀

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s