Parcial 2 - 2025a - Tema 1#
Ejercicio 1: Perritos Felices#
La asociación Perritos Felices está implementando un sistema que permitirá mantener una base de datos de cachorros en adopción y potenciales adoptantes. Para darse de alta en el sistema, cada adoptante registra su nombre de usuario, su teléfono y el listado de razas preferidas. En caso de no tener ninguna raza preferida, dejan ese campo vacío. Toda esta información se guarda en un archivo adoptantes.csv que posee la siguiente estructura:
la_romi, 1530721837, pastor alemán
belisario, 1518594038, doberman, pekinés
tincho_07, 1130784319
adrianitaa_, 1179224051, salchicha
A su vez, se dispone de un diccionario de cachorros pendientes de adopción con clave sabueso_id (número de identificación) y como valor una tupla con nombre y raza (indicando ‘-’ cuando no tiene raza definida). Ejemplo:
La asociación necesita implementar las siguientes funciones para ayudar a su trabajo diario:
-
(Cargar adoptantes) Escribir una función cargar_adoptantes() que lea todos los adoptantes en adoptantes.csv y retorne una lista de tuplas, donde cada tupla contenga el nombre de usuario, su teléfono y una lista con sus razas preferidas, por ejemplo: (‘belisario’, 1518594038, [‘doberman’, ‘pekinés’]). En caso de que no tenga raza preferida, se deberá colocar una lista vacía [ ] en esa posición.
-
(Buscando compañero) Cuando la comisión directiva considera que un cachorro está listo para ser adoptado, busca una persona del listado de adoptantes para contactarla telefónicamente. Escribir una función buscar_adoptante() que reciba dic_cachorros, la lista de adoptantes creada en el punto a) y el sabueso_id del cachorro que se busca dar en adopción. La función debe buscar entre los adoptantes hasta encontrar el primero cuya preferencia coincida con la raza del cachorro. Si el cachorro no tuviera raza, solo podrá ser adoptado por alguien que no tenga razas predilectas. La función debe devolver el nombre y teléfono del adoptante, eliminandolo de la lista. Si no hay coincidencia, la función deberá devolver None en ambos campos.
-
(Obtener puntajes) Algunas razas de cachorros suelen ser muy requeridas por los adoptantes, como es el caso del ‘labrador’ y el ‘caniche’. En este sentido, la asociación organiza eventos y campañas para difundir la adopción de otras razas menos populares. Escribir una función puntajes_cachorros() que procese la lista de adoptantes y retorne una lista de tuplas (raza, cantidad) que indique para cada raza la cantidad de cachorros solicitados.
-
(Estrategias de comunicación) La organización necesita saber cuáles son las tres razas menos populares de modo de poder hacer campaña a favor de las mismas. Para ello, implemente una función tres_menos_populares() que reciba la lista de tuplas especificada en el punto anterior, y la ordene (según la cantidad por raza) mediante un algoritmo de ordenamiento por selección. Finalmente se debe escribir en un archivo reporte.txt el resultado de la búsqueda indicando las tres razas peor rankeadas. Ejemplo:
Ejercicio 2: Recursión#
El algoritmo de ordenamiento merge sort es un algoritmo que aplica una estrategia recursiva: recibe una lista de elementos y la divide a la mitad, en dos sublistas. Cada una de estas sublistas se ordena por separado invocando la misma función merge_sort(). Luego, la lista completa ordenada se obtiene combinando las dos sublistas ordenadas en una sola. A continuación se revela parte de la implementación de la función, para ordenar un conjunto de números enteros:
def merge_sort(lista: list[int]):
sublista_1 = lista[ :(len(lista)//2+1) ]
sublista_2 = lista[ (len(lista)//2+1): ]
# Ordenar sublista 1
# Ordenar sublista 2
# Merge y retorno
Se pide completar el código faltante, definiendo claramente los casos base y recursivos que correspondan. Asuma que se dispone de la función mergear_listas_ordenadas(), que recibe dos listas (cada una ya ordenada) y las combina para formar una nueva lista completa ordenada. Ejemplo:
mergear_listas_ordenadas([3, 5, 8], [2, 6, 10]) → [2, 3, 5, 6, 8, 10].
Ejercicio 3: Complejidad#
Encuentre la función de costo temporal T(n) del siguiente código, en donde n representa el tamaño de la lista recibida. Luego determine la complejidad Big-O justificando su respuesta. Considere que las funciones len() y range() toman un tiempo constante que no depende de n.
def ejemplo(data: list):
x = 0
for e in data:
for j in range(len(data)):
x += e+j
for k in range(len(data)):
for l in range(len(data)):
for m in range(10):
x += 1
for p in range(1000):
x += 1
return x
Ejercicio 4: Numeración#
Realice las siguientes conversiones entre sistemas numéricos. Justifique los resultados indicando el procedimiento para llegar a los mismos (no se considerará correcto solo la respuesta sin justificación).
- Convertir el número binario 1011011101 a hexadecimal.
- Convertir el número decimal 27 a binario.
- Convertir el número hexadecimal 3FA a binario.
- Convertir el número hexadecimal 1B7 a decimal.