carmi1909@ciencias.unam.mx

ejercicio_resueltos_6
 avatar
Carmi
plain_text
2 years ago
6.1 kB
3
Indexable
Never
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 20 21:08:30 2021

@author: carmi
"""

#%% Ejercicio 128: Búsqueda inversa
"""
Descripción: 
    Escribe una función llamada busquedaInversa que encuentre todas las llaves en un
    diccionario que se asignan un valor específico. La función va a tomar el diccionario y el valor a buscar
    como sus parámetros. Va a regresar una lista (posiblemente vacía) de llaves del diccionario que se 
    asignan con el valor proporcionado.
    Agrega un programa principal (main) que demuestre la función busquedaInversa como parte de tu solución
    a este ejercicio. Tu programa debe crear un diccionario y luego mostrar que la función busquedaInversa
    funcione correctamente cuando regrese multiples llaves, una sola llave o ninguna llave. Asegurate que tu 
    programa principal solo corra cuando el archivo que contiene tu solución a este ejercicio no esté importado
    a otro programa

Solución:
    Definir función busqueda inversa(diccionario, valor):
        definir lista vacía LLAVES
        Por llave en diccionario:
            Si el valor de la llave es igual al valor:
                agregar a LLAVES el valor
        regresar LLAVES
    
    Definir una función principal (main) y probarla con la traducción de palabras en inglés a francés
    Correr la función main únicamente si el archivo no ha sido importado 
"""
def busquedaInversa(datos,valor):
    """
    Busqueda la llave de un diccionario dado un valor específico

    Parameters
    ----------
    datos : 
        Diccionario.
    valor : 
        Valor a buscar en el diccionario.

    Returns
    -------
    llaves : 
        Llaves correspondientes al valor dado.

    """
    llaves = []
    for llave in datos:
        if datos[llave] == valor:
            llaves.append(llave)
    return llaves

def main():
    """
    Función principal que manda a llamar busquedaInversa

    Returns
    -------
    None.

    """
    frEn = {"le" : "the", "la" : "the", "livre" : "book", "pomme" : "apple"}
    
    print("Las palabras francesas para 'the' son: ", busquedaInversa(frEn, "the"))
    print("Esperado: ['le', 'la']")
    print()
    print("La palabra 'apple' en frances es: ", busquedaInversa(frEn, "apple"))
    print("Esperado: ['pomme']")
    print()
    print("La palabra 'asdf' en francés es: ", busquedaInversa(frEn, "asdf"))
    print("Esperado: []")
    
if __name__ == "__main__":
    main()
"""
La parte que se me dificultó fue saber cómo referirse al valor de una correspondiente llave de un diccionaro,
para solucionar esto consulté la siguiente página: https://devcode.la/tutoriales/diccionarios-en-python/
Y lo que aprendí fue que nos ponemos treferir "the" como frEn[le] (usando el diccionario frEn)
"""
#%% Ejercicio 129: Simulación de dos dados
"""
Descripción:
    En este ejercicio simularas 100 lanzadas de dados. Empieza escribiendo una función
    que simule lanzar un par de dados de 6 lados. Tu función no tomará ningún parámetro.
    Va a regresar el total de los dados lanzados como su único resultado.
    Escribe un programa principal (main) que use tu función para simular el lanzamiento
    de dos dados de 6 lados 1000 veces. A medida que tu programa carra, deberá contar
    el número de veces que el total ocurra. A continuación, deberá mostrar una tabla que
    resuma estos datos. Expresa la frecuencia por cada total como un porcentaje del 
    total de lanzamientos. Tu programa también debera mostrar el porcentaje esperado por
    cada total de a cuerdo a la teoría de probabilidad.

Solución:
    Definir la función dosDados:
        dado_uno = valor aleatorio entre 1 y 6
        dado_dos = valor aleatorio entre 1 y 6
        regresar dado_uno + dado_2
    Definir función principal (main):
        Crear diccionario con cada numero posible a caer como llave y en cada valor poner la probabilidad
        que tiene de caer de acuerdo a la teoría
        Crear diccionario con cada numero posible a caer como llave y en cada valor poner 0 (se llamará CUENTAS)
    Por cada número en el rango (1000):
        lanzamiento = dosDados()
        CUENTAS[lanzamiento] = CUENTAS[lanzamiento] + 1
    
    Imprimir taba con una columna con el número a caer, una columna con el porcentaje de caídas correspondente a los 
    lanzamientos hechos y otra columna con el porcentaje esperado de acuerdo a la teoría de probabilidad
"""
from random import randrange

NUMERO_DE_CORRIDAS = 1000
D_MAX = 6

def dosDados():
    """
    Simula el lanzamiento de dos dados

    Returns
    -------
    Resultado de sumar los números caídos en cada dado

    """
    d1 = randrange(1, D_MAX + 1)
    d2 = randrange(1, D_MAX + 1)
    return d1 + d2

def main():
    """
    Ejecuta mil lanzamientos de dos dados y registra el porcentaje de caídas de cada número
    (del 2 al 12) en una tabla junto con el porcentaje de acuerdo a la teoría de la probabilidad

    Returns
    -------
    None.

    """
    esperado = {2: 1/36, 3: 2/36, 4: 3/36, 5: 4/36, 6: 5/36, 7: 6/36, 8: 5/36, \
                9: 4/36, 10: 3/36, 11: 2/36, 12:1/36}
        
    cuentas = {2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0}
    
    for i in range(NUMERO_DE_CORRIDAS):
        t = dosDados()
        cuentas[t] = cuentas[t] + 1
        
    print("Total   Porcentaje   Porcentaje")
    print("         Simulado     Esperado")
    for i in sorted(cuentas.keys()):
        print("%5d %11.2f   %8.2f" % \
              (i, cuentas[i] / NUMERO_DE_CORRIDAS * 100, esperado[i] * 100))
            
main()
"""
Lo que se me dificultó de este problema fue entender la función sorted, para esto visite la siguiente
página: https://docs.python.org/3/howto/sorting.html
Aprendí que se puede usar pra iterar las llaves en un diccionario, por ejemplo:
    >>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
    [1, 2, 3, 4, 5]
"""