Saltar a contenido

Parcialito 1 - 2025a - Tema 1#

Ejercicio 1#

Curiosidades del parque automotor argentino. La Dirección Nacional del Registro Automotor (DNRA) posee un listado con todos los vehículos registrados en el país. Para cada vehículo, la DNRA almacena un diccionario como el siguiente:

vehiculo =  {
    "marca": "Toyota",
    "modelo": "Corolla Cross",
    "versión": "XLI 2.0 CVT",
    "año": "2025",
    "dni_propietario": 22148790,
    "valuación_actual": 39525839
}

Este diccionario representa a un Toyota Corolla Cross del 2025, cuyo propietario tiene DNI número 22.148.790, y que está actualmente valuado en aprox. $39,5 millones de pesos. Supongamos que nuestro programa en Python posee una variable llamada lista_vehiculos que es una lista de diccionarios, conteniendo todos los vehículos registrados en el país. Cada elemento de esta lista es un diccionario con la estructura que vimos en el ejemplo anterior.

Necesitamos lo siguiente:

  1. Escribir una función marcas_en_circulacion(lista_vehiculos) que reciba la lista de vehículos y devuelva una lista con todas las marcas en circulación en nuestro país. Cada marca existente deberá figurar una única vez en el resultado.

  2. Escribir una función año_promedio(lista_vehiculos) que reciba la lista de vehículos y devuelva el año promedio en que se dieron de alta los vehículos.

  3. Escribir una función vehiculo_mas_valuado(lista_vehiculos) que reciba la lista de vehículos y devuelva la marca, el modelo y la valuación del vehículo que posee la valuación más alta en el país.

  4. Escribir un programa principal que, a partir de la lista de vehículos y aprovechando las dos funciones definidas anteriormente, imprima:

    1. La cantidad de vehículos que hay registrados en el país.
    2. La cantidad de años de antigüedad media del parque automotor en el país.
    3. La cantidad de marcas distintas que circulan en el país.
    4. La marca, modelo y valuación del vehículo más valuado.

La salida del programa debería tener un aspecto similar al siguiente:

En la Argentina hay 15340744 vehículos de 17 marcas distintas.
El parque automotor tiene una antigüedad media de 7.5 años, y
el vehículo más valuado es un Porsche modelo 911 Carrera, valuado
en 488.3 millones de pesos.

Ejercicio 2#

Dólar para todos. Desde el fin del cepo al dólar se disparó la cantidad de órdenes de compra y venta diarias de esta moneda, y necesitamos optimizar el algoritmo que automatiza el intercambio de pesos y dólares en el mercado libre de cambios.

Cada vez que una persona quiere vender o comprar dólares, se genera en el sistema un código de orden al que se le asocia una lista con 4 elementos.

Si se quiere vender dólares la lista contiene: el CUIT de la persona, la palabra “VENTA”, la cantidad de dólares que se quiere vender, y el precio mínimo en pesos que esa persona quiere recibir por cada dólar.

En cambio, para comprar dólares la lista contiene: el CUIT de la persona, la palabra “COMPRA”, la cantidad de dólares que se quiere comprar, y el precio máximo en pesos que está dispuesta a pagar por cada dólar.

De esta forma, las listas con las órdenes de compra o venta de dólares pendientes en el mercado se almacenan en un diccionario llamado ordenes_pend cuya clave es el código de orden. El siguiente ejemplo muestra el diccionario en un momento en que hay 5 órdenes pendientes:

ordenes_pend = {
    2291029: ["27-44316921-2", "VENTA", 340.00, 1200.00],
    2291033: ["20-26938102-8", "VENTA", 200.00, 1160.00],
    2291020: ["27-45781408-0", "COMPRA", 1500.00, 1180.00],
    2291041: ["20-40189732-5", "COMPRA", 2000.00, 1200.00],
    2291070: ["30-38293485-4", "VENTA", 800.00, 1180.00]
}

Nuestro algoritmo deberá seleccionar, dado un diccionario de órdenes pendientes, a la orden que esté dispuesta a pagar más pesos para comprar dólares (ese valor es el precio máximo de compra y lo llamaremos \(P_C\)), y a la orden que se conforma con recibir menos pesos para venderlos (ese valor es el precio mínimo de venta y lo llamaremos \(P_V\)). Una vez elegidas esas dos órdenes, si \(P_C\) es menor a \(P_V\) no puede realizarse ninguna operación porque no hay acuerdo de precios, de lo contrario puede realizarse una operación de intercambio. El precio al que se realiza la operación es el promedio entre los dos extremos, es decir, (\(P_C\)+\(P_V\))/2. La cantidad de dólares a intercambiar será la menor entre la de ambas órdenes.

En el ejemplo anterior, se elegiría a las dos órdenes señaladas en negrita, siendo \(P_C\)=1200 y \(P_V\)=1160, con un precio de intercambio (\(P_C\)+\(P_V\))/2 = 1180 pesos, y el intercambio será de 200 dólares. La orden de venta queda así totalmente ejecutada y se eliminará del diccionario, mientras que la orden de compra quedará con 1800 dólares pendientes para comprar.

Para implementar esta lógica, te pedimos:

  1. Escribir la función seleccionar_ordenes(ordenes_pend) que, dado un diccionario de órdenes pendientes, encuentre la orden de venta de menor precio (\(P_V\)) y la orden de compra de mayor precio (\(P_C\)). Si hubiera varias órdenes candidatas se puede seleccionar a cualquiera. La función tiene que retornar los códigos de ambas órdenes (son números enteros) y una variable “estado”. Si \(P_C\) es mayor a \(P_V\) se tendrá que realizar una operación por lo que el valor de estado debe ser 0. Si \(P_C\) es menor a \(P_V\) entonces no se tiene que ejecutar ninguna operación por lo que el valor de estado debe ser 1. Si no se encuentran órdenes de compra o de venta en el diccionario, los códigos de órdenes a devolver deberán tener el valor None y el valor de estado debe ser 1.

  2. Para ejecutar una compra/venta de dólares para un diccionario de órdenes pendientes, dado un código de orden de compra y un código de venta, escribir la función realizar_compraventa(ordenes_pend, cod_orden_compra, cod_orden_venta) que devuelva:

    1. La cantidad de dólares a intercambiar, calculada como el mínimo entre los montos indicados en esas dos órdenes.
    2. El valor al que se realizará la operación, calculado como el promedio entre los precios que indican ambas órdenes, (\(P_C\)+\(P_V\))/2.

    Adicionalmente, la función deberá: 1. Si ambas órdenes indican el mismo monto, eliminarlas del diccionario. 1. Si una tiene mayor monto que la otra, eliminar a la orden de menor monto, y a la de mayor monto restarle el monto que se intercambiará.

  3. Escribir un programa principal que, dado un listado de órdenes pendientes ya precargado, seleccione pares de órdenes de compra/venta a combinar en base a la función realizada en el primer punto, y luego ejecute dicha compraventa utilizando la función realizada en el segundo punto.

El programa deberá repetir esta lógica siempre que siga encontrando pares de órdenes a combinar y, para cada compraventa realizada, deberá imprimir cuántos dólares se intercambiaron y a qué valor. Cuando el programa ya no encuentre órdenes de compra/venta a combinar, deberá imprimir el listado de órdenes que le quedan pendientes y terminar.

Para el ejemplo que mostramos inicialmente, la salida del programa se debería asemejar a la siguiente:

Se venden 200.00 dólares a 1180.00 pesos.
Se venden 800.00 dólares a 1190.00 pesos.
Se venden 340.00 dólares a 1200.00 pesos.
Programa terminado. Órdenes pendientes:
{
    2291020: ["27-45781408-0", "COMPRA", 1500.00, 1180.00],
    2291041: ["20-40189732-5", "COMPRA", 660.00, 1200.00]
}