Saltar a contenido

Parcialito 2 - 2024a - Tema 2#

Ejercicio 1#

Un famoso sitio web de turismo nos ha contactado para desarrollar un sistema que simplifique el planeamiento de las vacaciones de sus usuarios. El equipo de desarrollo nos provee de dos archivos de su base de datos de ciudades y actividades. Por un lado, el archivo destinos.csv lista las actividades disponibles para realizar en cada ciudad del mundo y actividades.csv contiene información de valoración (rating de popularidad) y el costo asociado (precio) de cada actividad.

A continuación se muestra un ejemplo de cómo se verían estos tipos de archivos si los abrimos con un editor de texto plano:

destinos.csv
Ciudad, Actividad 1, Actividad 2, Actividad 3, ...
Buenos Aires, Tour al Obelisco, Visita a la Casa Rosada, Paseo por caminito, Visita a San Telmo
París, Visita a la torre Eiffel, Tour al museo Louvre, Visita al arco del triunfo, Visita a Notre Dame
Tokio, Masterclass de Sushi, Visita a santuario Meiji, Visita al Museo Ghibli
New York, Obra de teatro en Broadway, Tour al Times Square, Visita a la estatua de la libertad
...
actividades.csv
Actividad, Valoración, Precio
Tour al Obelisco, 4, 5
Visita a la Casa Rosada, 3.2, 15
Paseo por caminito, 4.8, 30
Visita a San Telmo, 4.2, 5
Visita a la torre Eiffel, 4.3, 50
Tour al museo Louvre, 4.6, 120
Visita al arco del triunfo, 3.4, 20
...
  1. Primeramente se requiere que se implementen dos funciones que carguen los datos disponibles. Implemente una función cargar_destinos(archivo_destinos:str) -> dict[str] que reciba el nombre de un archivo csv con datos de destinos con el formato del ejemplo, y retorne un diccionario con los destinos como clave y una lista de actividades como valores. Ejemplo:

    {
        "Buenos Aires": ["Tour al Obelisco", "Visita a la Casa Rosada", "Paseo por caminito", "Visita a San Telmo"],
        "París": ["Visita a la torre Eiffel", "Tour al museo Louvre", "Visita al arco del triunfo", "Visita a Notre Dame"],
        "Tokio": ["Masterclass de Sushi", "Visita a santuario Meiji", "Visita al Museo Ghibli"],
        "New York": ["Obra de teatro en Broadway", "Tour al Times Square", "Visita a la estatua de la libertad"],
        ...
    }
    

    Luego, implemente una función cargar_actividades(archivo_destinos:str) -> dict[str] que reciba el nombre de un archivo csv con datos de actividades, y retorne un diccionario con las actividades como clave y un diccionario con la información de valoración y precio como valor. Ejemplo:

    {
        "Tour al Obelisco": {"valoracion": 4, "precio": 5},
        "Visita a la Casa Rosada": {"valoracion": 3.2, "precio": 15},
        "Paseo por caminito": {"valoracion": 4.8, "precio": 30},
        "Visita a San Telmo": {"valoracion": 4.2, "precio": 5},
        "Visita a la torre Eiffel": {"valoracion": 4.3, "precio": 50},
        "Tour al museo Louvre": {"valoracion": 4.6, "precio": 120},
        "Visita al arco del triunfo": {"valoracion": 3.4, "precio": 20},
        ...
    }
    
  2. Implemente una función llamada ordenar_por_precio(actividades:list[str], info_actividades:dict[str])-> None tal que reciba una lista de actividades y las ordene de menor a mayor precio en base a la información disponible en el diccionario (el diccionario info_actividades sigue el formato del ejercicio anterior).

  3. En base a las funciones implementadas en los ejercicios anteriores, se requiere que implemente una función llamada filtrar_actividades(destino:str, umbral_val:float, costo_maximo:float)->list[str] que utilice la información disponible en los archivos destinos.csv y actividades.csv y retorne una lista de aquellas actividades del destino ordenadas por precio de menor a mayor tal que, además, tengan una valoración mayor a umbral_val y un costo menor a costo_maximo.

Ejercicio 2#

Un texto o frase se considera un palíndromo (“capicúa”) cuando sus carácteres están dispuestos de tal manera que el texto es el mismo al leerlo de izquierda a derecha, y de derecha a izquierda.

  1. A continuación se muestra una función que resuelve el problema en forma iterativa, indique cuál es su complejidad computacional en términos del número de caracteres N de la cadena de texto de entrada. Justifique su respuesta.

    def es_palindromo(texto:str):
        """
        Chequea si un texto es palíndromo.
    
        Argumentos:
        texto -- (str) el texto a chequear.
    
        Retorna:
        bool -- True si el texto es palíndromo, False en caso contrario.
        """
        texto = texto.lower()
        length = len(texto)
    
        for i in range(length//2):
            if texto[i] != texto[length-i-1]:
                return False
    
        return True
    
  2. Implementar una función recursiva es_palindromo(texto:str) que tome como argumento de entrada una cadena de caracteres y devuelva el booleano True si el texto es un palíndromo (si es “capicúa”) y False si no lo es.

    Tomar en cuenta que una sola letra se considera un palíndromo y un string vacío también. Ejemplos de palíndromos: “seres”, “acurruca”, “kayak, “tacocat”, ”somos seres somos”, “y”, “”.