Saltar a contenido

Recuperatorio - 2025b - Tema 1#

Importante: todas las funciones deben incluir sus type hints.

Ejercicio 1#

Un programa para gestión de aplicaciones dispone de información sobre los usuarios en un archivo CSV llamado ‘usuarios.csv’. Cada fila del archivo contiene distintas columnas (id, nombre, rol y apps usadas habitualmente), donde las "," separan las categorías principales y las ";" las subcategorías dentro de la columna apps. Por ejemplo:

usuarios.csv
id,user,rol,apps
1,ana,admin,chat;mail
2,luis,student,shop;news;chat
3,mia,guest,news
...
  1. Se pide implementar una función generar_lista(), que lea archivo CSV y construya una lista de usuarios, donde cada usuario se represente con un diccionario con claves id, user, rol y apps, estando esta última asociada a una lista de strings que contenga las aplicaciones más habituales para ese usuario. Ejemplo de la estructura esperada:

    [
        {'id': 1, 'user': 'ana', 'rol': 'admin', 'apps': ['chat', 'mail']},
        {'id': 2, 'user': 'luis', 'rol': 'student', 'apps': ['shop', 'news', 'chat']},
        {'id': 3, 'user': 'mia', 'rol': 'guest', 'apps': ['news']}
        ...
    ]
    
  2. A partir de una lista de diccionarios como la del punto anterior, se debe implementar una función definir_puntajes(), con su correspondiente Docstring, que reciba la lista y un diccionario puntajes_apps (ver siguiente ejemplo) y retorne una nueva lista de diccionarios con los mismos campos, pero en vez de la clave ‘apps’, debe contener la clave ‘puntos’, cuyo valor sea los puntos acumulados de todas las apps asociadas a ese usuario. Para obtener los puntajes de cada app, se dispone de un diccionario predefinido de la forma:

    puntajes_apps = {
        "mail": 14,
        "chat": 25,
        "shop": 7,
        "news": 18
        ...
    }
    

    La estructura retornada por la función, deberá ser como la siguiente:

    [
        {'id': 1, 'user': 'ana', 'rol': 'admin', 'puntos': 39},
        {'id': 2, 'user': 'luis', 'rol': 'student', 'puntos': 50},
        {'id': 3, 'user': 'mia', 'rol': 'guest', 'puntos': 18}
        ...
    ]
    
  3. Se debe implementar la función ordenar_usuarios() que reciba la lista de diccionarios con los puntajes y retorne otra lista de diccionarios ordenada según el puntaje de mayor a menor. Analice la complejidad Big-O de esta función. Nota: no pueden utilizarse métodos como sort(). Ejemplo de la estructura esperada:

    [
        {'id': 2, 'user': 'luis', 'rol': 'student', 'puntos': 50},
        {'id': 1, 'user': 'ana', 'rol': 'admin', 'puntos': 39},
        {'id': 3, 'user': 'mia', 'rol': 'guest', 'puntos': 18}
        ...
    ]
    
  4. Finalmente, se debe implementar un programa principal que, suponiendo ya se dispone del archivo ‘usuarios.csv’ y el diccionario puntajes_apps, guarde en un nuevo archivo CSV los datos de los usuarios ordenados de mayor a menor puntaje. El nombre del archivo de salida deberá solicitarse por terminal. Un ejemplo de ejecución sería:

    Ingrese el nombre del archivo de salida: user_rank.csv
    Se generó y guardó exitosamente el archivo "user_rank.csv"
    

    Ejemplo de lo que debería guardarse en el archivo de salida:

    user_rank.csv
    id,user,rol,puntos
    2,luis,student,50
    1,ana,admin,39
    3,mia,guest,18
    ...
    

Ejercicio 2#

  1. Implemente una función recursiva llamada detectar_largo() que reciba como parámetros una lista de palabras y un entero positivo n. La función debe retornar True si existe al menos una palabra en la lista cuyo largo sea estrictamente mayor que n, y False en caso contrario.

  2. Escriba un programa principal que, al ejecutarse, solicite por teclado el ingreso de una cadena de texto y un entero n que represente el largo límite a comparar. A partir de la cadena ingresada, el programa debe generar una lista de palabras, utilizar la función recursiva del punto anterior y mostrar por pantalla un mensaje indicando si la cadena ingresada contiene o no alguna palabra cuyo largo supere el valor n.

Ejemplos de ejecución por terminal:

Ingrese una cadena de texto: Esto es una prueba simple
Ingrese el largo límite: 6
La cadena contiene al menos una palabra con largo mayor que 6
Ingrese una cadena de texto: Esto es una prueba simple
Ingrese el largo límite: 10
La cadena no contiene ninguna palabra con largo mayor que 10

Ejercicio 3#

Responda los siguientes ítems justificando cada caso (no se contarán puntos sin justificación):

  1. Convertir el decimal 45 a binario.
  2. Convertir el hexadecimal 0x3A7 a decimal.
  3. Convertir el hexadecimal 0x29 a binario.
  4. V/F: “Los valores que puede representar un número en punto flotante no tienen una separación uniforme”.
  5. V/F: “El número -13 en complemento a 1, representado con 5 bits, es 10010”.