3Eva_IT2019_T2 Juego del ahorcado

3ra Evaluación I Término 2019-2020, Septiembre 13, 2019

Tema 2. (30 puntos)
Escriba un programa de Python que implemente un juego de adivinanzas de palabras.

Considere que para su programa ya están definidas las siguientes variables y función:

1. Una lista C de las categorías para el juego.

C = ['Transportes', 'Alimentos', 'Deportes', ...],

2. La función perteneceCategoria(palabra, categoria) que retorna True si palabra pertenece a la categoria, False en caso contrario.

3. El diccionario puntajes con el siguiente formato:

puntajes = {'Transportes':{'a':10, 't':4, 'f':5, ...},
            'Deportes': {'a':3, 'z':5, 't':10, ...},
             ... }

Para la implementación del juego considere las siguientes reglas:

r1. El jugador tiene cinco turnos para jugar

Para cada turno:

r2. El programa selecciona aleatoriamente una categoría de la lista C

r3. El programa le pide al jugador que ingrese una palabra para la categoría seleccionada en el paso r2

r4. Si la palabra pertenece a la categoría dada y no ha sido ingresada en un turno anterior, calcule los puntos totales para la palabra.
El puntaje de la palabra es la suma de los puntajes de cada una de sus letras, de acuerdo al diccionario puntajes.
Una letra tendrá puntajes distintos dependiendo de la categoría del paso r2.
Si la palabra no cumple con las condiciones, el jugador no obtiene puntos en ese turno

r5. En cada turno, muestre el puntaje obtenido para la palabra ingresada y el puntaje acumulado

Al final de los cinco turnos:

r6. El jugador habrá ganado si completa un mínimo de 500 puntos, muestre el mensaje correspondiente “Ganó” o “Perdió”.

2Eva_IT2019_T2 Separar indicadores

2da Evaluación I Término 2019-2020, Agosto 30, 2019

Tema 2. (40 puntos) Dado el archivo indicadores.csv​ con el siguiente formato:

Indicador, columna, min1|max1|puntaje1, min2|max2|puntaje2, ..., minN|maxN|puntajeN

Ejemplo:

Indicador,Columna,Puntajes
Num_empresas,17,0|9|1,10|19|2,...
Num_coworkings,5,0|15|10,16|30|15,...

Y el archivo ​estadisticas.csv​ con el siguiente contenido de ejemplo:

Buenos Aires, México, Budapest, ... 
Ciudad,Indicador,valor 
Santiago de Chile,Num_empresas,58
Guayaquil,Inversion en $,17423...
Guayaquil,Num_coworkings,5

Nota: La primera línea del archivo ​estadisticas.csv​ tiene los nombres de todas las ciudades presentes en el archivo, mientras que la segunda línea es su cabecera. Una ciudad puede estar repetida en varias líneas del archivo pero con un indicador diferente.

Escriba un programa en Python que cree el diccionario ​indicadores​, el arreglo ​ciudades​ y la matriz ​M​ utilizados en el ​TEMA 1​.

Rúbrica: crear diccionario ( puntos), crear arreglo ( puntos), crear matriz ( puntos) Nota: puntos detallados no indicados en el impreso del examen original.

2Eva_IT2019_T1 Indicador de innovación por ciudad

2da Evaluación I Término 2019-2020, Agosto 30, 2019

Tema 1. (50 puntos) Asuma que tiene la matriz M cuyas filas representan ciudades del mundo, las columnas representan indicadores de innovación y cada celda contiene el valor que tiene la ciudad para un indicador.

Además, cuenta con el diccionario indicadores con el siguiente formato:

indicadores = {'Num_empresas':{'columna':17,
                               'puntaje':{(0,9):1,
                                          (10,19):2,
                                          ...}
                               },
               'Num_coworkings':{'columna':5,
                                 'puntaje':{(0,15):10,
                                            (16,30):15,...}
                                 },
               ...
               }

Finalmente, cuenta con un arreglo ciudades con los nombres de las ciudades en el mismo orden que aparecen en las filas de la matriz M.

Implemente las siguientes funciones:

a. obtenerPuntajes(M, indicadores, indicador) que recibe la matriz M , el diccionario de indicadores , y el nombre de un indicador; y devuelve un vector con el puntaje obtenido por cada ciudad en ese indicador.
Por ejemplo: Si una ciudad, tiene un valor de 15 para el indicador 'Num empresas', obtendrá 2 como puntaje.

b. crearMatrizPuntajes(M, indicadores) que recibe la matriz M y el diccionario de indicadores; y retorna una matriz de puntajes( P) cuyas filas representan ciudades, las columnas representan indicadores y el valor de cada celda representa el puntaje obtenido por esa ciudad en ese indicador.

c. topCiudades(P, minPuntaje, ciudades, K) que recibe una matriz de puntajes P, un puntaje mínimo, el arreglo con los nombres de las ciudades y un entero K; y retorna un arreglo con los nombres de las ciudades cuyo total de puntos en los primeros K indicadores (columnas) sea al menos minPuntaje.

d. numEmpresas(M, P, indicadores, N) que recibe la matriz M ,una matriz de puntajes P, el diccionario indicadores y un entero N. Encuentre las N ciudades con mayor puntaje total y retorne el número promedio de empresas (indicador 'Num empresas') de esas ciudades.

Rúbrica: literal a (14 puntos), literal b (12 puntos), literal c (10 puntos), literal d (14 puntos)


Referencias: https://www.distrito100.com/, https://www.eluniverso.com/noticias/2019/04/21/nota/7292456/guayaquil-da-primer-paso-busca-innovacion/

 

3Eva_IIT2018_T2 Jugadores Sudamericano Sub-20

3ra Evaluación II Término 2018-2019. 15-Febrero-2019 /CCPG001

Tema2. (60 puntos) Asuma que tiene un archivo por cada partido jugado en el Sudamericano Sub-20. Cada archivo tiene información con datos de los jugadores que participaron en el partido con el siguiente formato:

Ejemplo:
Pais,Jugador,Tarjetas_Amarillas,Tarjetas_Rojas,Goles,Minutos,KM_recorridos
...
Ecuador,Jose Cifuentes,1,0,0,75,6.3
Uruguay,Sebastian Caceres,2,1,0,90,7
Ecuador,Leonardo Campana,0,0,1,87,10
...

Implemente las siguientes funciones:

1.  actualizaDiccionario(nomArchivo,dic) que recibe el nombre de un archivo con los datos del partido y actualiza el diccionario de totales por jugador que tiene el siguiente formato:

dic = {'Ecuador': {'Leonardo Campana': {'TA': 0,
                                        'TR': 0,
                                        'Goles': 1,
                                        'Minutos': 87,
                                        'KM': 10.0}},
       'Uruguay': {'Sebastian Caceres': {'TA': 2,
                                         'TR': 1,
                                         'Goles': 0,
                                         'Minutos': 90,
                                         'KM': 7.0}
                   }
       }

2. buenDeportista(jugador, dic) que recibe el nombre de un jugador y el diccionario de totales y determina si ese jugador puede ser catalogado como un «buen deportista»; la función retorna «True» o «False» . Un jugador se considera «buen deportista»si ha recibido menos de dos tarjetas por cada 270 minutos de juego.

3.JugadorAtleta(jugador,dic) que recibe el nombre de un jugador y el diccionario de totales, determinando si el jugador ha corrido como mínimo el promedio de lo que han corrido los jugadores de su pais y ha anotado al menos un gol; la función retorna «True» o «False»

4. paisBuenasPracicas(pais,dic) que recibe el nombre de un país y el diccionario de totales, analizando si ese país puede ser nominado para el «Best Practices award». Un país puede ser nominado a este premio si TODOS los jugadores del país pueden ser catalogados como «buen deportista». La funcion retorna «True»o «False»

Escriba un programa que:

5. Forme el diccionario de totales a partir de una lista con los nombres de los archivos de datos de los partidos. Asuma que tiene una lista para esta tarea:

L = ['br-ur.csv', ...,'ec-vn.csv']

6. Muestre los siguiente datos por país:

a. Porcentaje de jugadores atletas. es decir e número de jugadores atletas dividido para el total de jugadores del país.

b. Goles por Km recorrido, es decir el número de goles del país dividido para el total de Km recorridos por todos sus jugadores

7. Muestre los países nominados para el «Best Practices award

8 Muestre la nómina de jugadores atletas con su respectivo país.

Rúbrica: numeral 1(15 puntos), numeral 2 (9 puntos), numeral 3 (9 puntos), numeral 4( 9 puntos), numeral 5(2 puntos), numeral 6 (5 puntos cada literal), numeral 7 (3 puntos), numeral 8 (3 puntos).


Referencia: Ecuador clasifica al mundial de Polonia sub-20 tras empate de Colombia y Uruguay. https://www.eluniverso.com/deportes/2019/02/10/nota/7183619/ecuador-clasifica-mundial-polonia-sub-20-tras-empate-colombia

 

2Eva_IIT2018_T3 Hielo y especies en Ártico-Diccionario

2da Evaluación II Término 2018-2019. 2-Febrero-2019 /CCPG001

Sección 3. Función para crear diccionario

Para el siguiente numeral, asuma que tiene un diccionario con los nombres de todas las especies del ártico en el siguiente formato:

dicEspecies = {codigo_especie:nombre_especie}

5. crearDiccionario(mHielo, mAnimales, dicEspecies) que recibe una matriz de hielo, una matriz de animales y el diccionario de las especies del Ártico.
La función crea un diccionario con los datos anteriore similar al mostrado:

dic = {'densidad hielo':{'Q1':0.75,
                         'Q2':0.11,
                         'Q3':0.55,
                         'Q4':0.47},
       'Especies':{ 1:51,
                    2:6,
                    ...
                    67:93}
       }

Para ‘Especies’ usar {especie:poblaciónTotal}

Rúbrica: Numeral 5 (20 puntos)

3Eva_IT2018_T1 Choferes y Rutas Trailers

3ra Evaluación I Término 2018-2019. 14-Septiembre-2018 /CCPG001

(Editado para tarea, se mantiene el objetivo de aprendizaje)

Tema 1 (40 puntos). En una empresa de transporte de carga (trailers) se registran para cada fecha, el código de  los choferes que manejaron en una ruta.

https://patiodeautos.com/revista/generales/trailer-electrico-tesla
https://patiodeautos.com/revista/generales/trailer-electrico-tesla

El registro genera un archivo "rutasManejadas2018.txt" en el formato mostrado:

id_ruta, id_chofer, fecha
Guayaquil-Cuenca,SMS,17-05-2018
Guayaquil-Cuenca,AGB,18-05-2018
Guayaquil-Cuenca,SMZ,17-05-2018
Guayaquil-Daule,EVN,17-05-2018
Guayaquil-Daule,AAQ,18-05-2018

Por lo rutinario del trabajo, se ha recomendado que los choferes no repitan una ruta para los últimos n días a partir de una fecha. Para seguir la recomendación se requiere implementar:

a) La función cargarDatos(narchivo) que recibe un archivo de registro y retorna una tupla con:
– un conjunto con los choferes que trabajaron en las fechas  del archivo (id_chofer)
– los datos del archivo en un diccionario con la estructura mostrada.

{'17-05-2018': {'Guayaquil-Cuenca': ['SMS', 'SMZ', ...],
                'Guayaquil-Daule': ['EVN', ...]},
 '18-05-2018': {'Guayaquil-Cuenca': ['AGB', ...],
                'Guayaquil-Daule': ['AAQ', ...]}}

b) La función encontrarChoferes(datos, loschoferes, unafecha, unaruta, n),  que para seguir la recomendación, encuentra aquellos choferes que no manejaron en una ruta, durante los n dias anteriores a una fecha.

c) La función grabarArchivo(datos, loschoferes, unafecha, unaruta, n) que crea un archivo con el resultado de la función anterior con el formato mostrado. El nombre del archico generado se conforma como: «unaruta_unafecha.txt»

Nombre de archivo: Guayaquil-Cuenca_19-05-2018_2.txt

Para la ruta Guayaquil-Cuenca los choferes disponibles para la fecha 19-05-2018 que no hayan manejado 2 dias anteriores son: 
EVN
AAQ

d) Genere todos los archivos para todas las rutas disponibles.

NOTA: Para administrar las fechas, usted ya dispone de una función calcularFecha(unafecha,n) que recibe una fecha y los n días anteriores y determina la fecha pasada. El formato de fecha se maneja en el mismo formato de fecha que el archivo.

>>> calcularFecha('19-05-2018',2)
'17-05-2018'

Rúbrica: Literal a (12 puntos), Literal b(16 puntos), Literal c y d (12 puntos)

Referencia: Archivo original 3raEvaI_Term2018.pdf

2Eva_IT2018_T2 Pago nomina mensual

2da Evaluación I Término 2018-2019. 31-Agosto-2018 /CCPG001

(Editado para tarea, se mantiene el objetivo de aprendizaje)

Tema 2. (50 puntos) Una compañía, con miles de empleados y varias sucursales en el país, paga sus salarios por hora clasificadas como:

– horas regulares (HR),
– horas fuera de horario normal (HER),
– fines de semana (HFDS) y
– feriados (HF).

El registro de asistencia de los empleados contiene: dia, mes, año, cantidad de horas trabajadas, entre otros mostrados en el archivo ejemplo.

El archivo inicia con líneas del valor en dólares por hora, los factores de pago por tipo, una linea de encabezado y el detalle de las horas trabajadas por empleado. Por ejemplo:

VH,10,Valor Hora en ésta compañía
HR,1,Factor Horas Regulares
HER,1.21,Factor Horas Extras en dias Regulares (lunes-viernes)
HFDS,1.37,Factor Horas en Fin De Semana (Sabado o domingo)
HF,1.39,Factor Horas en Feriado
Fecha,dia,feriado,ID,nombre,sucursal,ciudad,horas-trabajadas
...
10-Agosto-2018,5,Si,FG848801,Fabricio Granados,River Mall,Cuenca,1
10-Agosto-2018,5,Si,GH907603,Segunda Vez Zambrano,River Mall,Cuenca,1
09-Agosto-2018,4,No,FG848801,Fabricio Granados,River Mall,Cuenca,9
...

Las horas extras en días regulares se calculan después de la 8va hora de trabajo.

Si el empleado trabajó en un dia feriado, que también es fin de semana, el factor aplicado es el más alto, es decir feriado.

Desarrolle las funciones descritas a continuación y un programa para calcular los valores a pagar para cada empleado.

a) calcularHoras(linea). Recibe una línea del archivo y determina el número de horas trabajadas para cada categoría. El resultado es una tupla con el identificador del empleado, ciudad y horas trabajadas regulares, extras, fines de semana y feriado.

>>> linea = "09-Agosto-2018,4,No,FG848801,Fabricio Granados, River Mall, Cuenca,9"
>>> calcularHoras(linea)
('FG848801','Cuenca',8,1,0,0)

b) leerData(nomA). Recibe el nombre del archivo de nómina (nomA) correspondiente a un mes de un año y retorna una tupla de tres elementos: (totales, mes, año).   Totales es un diccionario con la suma en dólares de HR, HER, HFDS y HF trabajados por cada empleado con la siguiente estructura:

totales = {'Cuenca':
            {'FG848801': {'HR': 530.0, 'HER': 36.30,
                          'HFDS': 0.0, 'HF': 13.89},
             'GH907603': {'HR': 425.0, 'HER': 48.30,
                          'HFDS': 13.70, 'HF': 13.90}
             ...
             }
          'Quito' :
            {...},
          ...
          }

c) generaReporte(nomA). Recibe el nombre del archivo de nómina (nomA) correspondiente a un mes de un año y genera un nuevo archivo reporte para cada ciudad.
Cada archivo reporte tiene como nombre «ciudadMes-Año.txt» y contiene: cabecera y la siguiente información por cada empleado:

idEmpleado, total$HorasRegulares, total$HorasExtras(HER+HFDS+HF)

Rúbrica: literal a (12 puntos), literal b (25 puntos), literal c (13 puntos)

Referencia: Archivo original 2daEvaI_Term2018.pdf

2Eva_IT2018_T1 Niveles seguridad por ciudad

2da Evaluación I Término 2018-2019. 31-Agosto-2018 /CCPG001

(Editado para tarea, se mantiene el objetivo de aprendizaje)

http://www.ecu911.gob.ec/wp-content/uploads/2017/06/1-37.jpeg
Sistema ECU911

Tema 1. (40 puntos) Para analizar los niveles de seguridad en el país, se registran los incidentes por ciudad y tipo delito en un archivo.

incidentes
robo vehículo asalto Escandalo vía pública
Quito 540 4523 24
Guayaquil 605 6345 5
Cuenca 123 676 133
Machala 67 1234 412
…. ….

Dispone de un modulo «ecu911» con la función cargarDatos(nombrearchivo) que lee el archivo y entrega un diccionario con la las veces que se ha reportado cada tipo de delito para cada ciudad del país en  el siguiente formato:

diccionario = {
    'Guayaquil':{'robo vehiculo':605, 'asalto':6345, ...},
    'Cuenca':   {'robo vehiculo':123, 'asalto': 676, ...},
    ...
    }

Para  crear el diccionario debe importar el módulo.

Se requiere implementar lo siguiente:

a.  Una función tablatitulos(diccionario) que recibe el diccionario descrito y retorna una coleccion:

titulos = (ciudad, tipodelito)

ciudad contiene las ciudades del archivo, y tipodelito contiene los tipos considerados en el diccionario, ambos sin duplicados.

b. La función crearMatriz(diccionario) que usando la información del diccionario crea una matriz con el número de incidentes por ciudad y tipo de delito. La matriz es un arreglo de numpy, semejante al ejemplo:

>>> matriz
array([[ 530, 4523,  24, ...],
       [ 605, 6345,   5, ...],
       [ 123,  676, 133,...],
       [  67, 1234, 412, ...],
       ... 
        ])

c. Una función ciudadesMenosSeguras(matriz, titulos, untipo, poblacion) que retorna los nombres de las tres ciudades que tienen el mayor indice per capita de para untipo de delito.

\text{indice per capita} = \frac{\text{numero de incidentes reportados}}{\text{poblacion de la ciudad}}

La función recibe la matriz , titulos de los literales anteriores, un tipo de delito  y  la población de cada ciudad del país en un vector, arreglo Numpy.

Rúbrica: literal a (10 puntos), literal b (20 puntos), literal c (10 puntos).

Referencia: Archivo original 2daEvaI_Term2018.pdf

3Eva_IIT2017_T1 Mantenimiento vehículos

3ra Evaluación II Término 2017-2018. Febrero 23, 2018 /CCPG001

(Editado para tarea, se mantiene el objetivo de aprendizaje)

Tema 1. (40 puntos)  CuidaVehículo.com requiere una aplicación para gestionar el mantenimento vehículos clasificados por tipo: ‘preventivos‘ y ‘correctivos‘ .

Dispone de la tabla de mantenimientos recomendados por tipo para cada parte del vehículo. La tabla contiene los parámetros que considera el número de días y recorrido en Kilómetros desde el último mantenimiento.

El historial registra la placa del vehículo, el cliente, parte, tiempo y recorrido desde el último mantenimiento.

Las tablas son siempre usadas como parámetros de ingreso en las funciones y se almacenan en diccionarios con la estructura mostrada:

dictMantenimiento = {
    'preventivo': [('llantas',  60,  4500),
                   ('bujias',   45,  3000)],
    'correctivo': [('llantas',  90,  6000),
                   ('zapatas', 120, 10000)]
    }

dictHistorial = {
    'GEC-2411': {
        'propietario': 'Eduardo Cueva',
        'registro': [('llantas',  12, 32500),
                     ('zapatas', 180, 500)]
        },
    'GAA-0321': {
        'propietario': 'Andrea Martinez',
        'registro': [('bujias',   40, 500),
                     ('zapatas', 120, 100)]
        }
    }

a) Elabore una función mantenimientos(strPlaca, dictHistorial, dictMantenimiento) que dada una placa de vehículo, realiza una lista de las partes con el tipo de mantenimiento recomendado: ‘preventivo‘, ‘correctivo‘ o ‘ninguno‘.

Solo un tipo de mantenimiento se realiza para cada parte del vehículo, considerando siempre el parámetro de recorrido en Kilómetros. En el caso que una parte supera el parámetro para ambos tipos de mantenimiento, se da prioridad al mantenimiento ‘correctivo‘.

El resultado es una lista de tuplas con las partes y tipo de mantenimiento.

b) Escriba una función semaforo(strPlaca, dictHistorial, dictMantenimiento) que establece un código de colores para cada tipo de mantenimiento: , amarillo: ‘preventivo‘ , rojo: ‘correctivo‘ y verde: ‘ninguno‘.

El resultado es un diccionario que tiene como clave el color y como datos una lista con las partes correspondientes a cada tipo de mantenimiento.

c) Realice una función recomendar(strparte, strtipoMantenimiento, dictHistorial, dictMantenimiento) que entrega una lista de placas de vehículos que requieren el tipo de mantenimiento para una parte dada.

Rúbrica: literal a (15 puntos), literal b (15 puntos), literal c (10 puntos)

Referencia: Archivo original 3Eva_IIT2017.pdf

2Eva_IIT2017_T1 Citas San Valentín

2da Evaluación II Término 2017-2018. Febrero 14, 2018 /CCPG001

(Editado para tarea, se mantiene el objetivo de aprendizaje)

Tema 1. (35 puntos) Para un servicios de citas «san valentín» , se pretende presentar parejas para el día del «amor y la amistad». Los datos de las personas se almacenan en una estructura de datos tipo diccionario: dicPersonas.

Para conocer la compatibilidad entre dos personas, se utilizan sus características y el índice de Tanimoto  que es un valor entre [0, 1] determinado como:

Tanimoto(P_1,P_2) = \frac{|caracteristicasP_1 \cap caracteristicasP_2|}{|caracteristicasP_1 \cup caracteristicasP_2|}

El emparejamiento resulta verdadero cuando: el valor del índice de Tanimoto es superior o igual al nivel de aceptación y la pareja no han tenido citas previas (sin importar su tipo: exitosa o fallida).

dicPersonas = {
    'p1021': {'nombre': 'Carlos S.',
              'caracteristicas': {'alegre',
                                  'fumador',
                                  'hacker',
                                  'deportista'},
              'citas': {'fallidas': ['P1902',
                                     'P2893',
                                     'P2310'],
                        'exitosas': ['P4025',
                                     'P1001']}
              },
    'p1001': {'nombre': 'Andrea V.',
              'caracteristicas': {'farrero',
                                  'programador',
                                  'fabuloso',
                                  'deportista'},
              'citas': {'fallidas': ['P1802'],
                        'exitosas': ['P1021',
                                     'P1002']}
              }
    }

a) Realice una función hayEmparejamiento(codigoP1, codigoP2, dicpersonas, aceptacion) para encontrar los valores del índice de Tanimoto y emparejamiento.

La función recibe el código de dos personas, el diccionario de personas (dicpersonas) y el nivel de aceptación mínimo [0,1]  para entregar los resultados en una tupla.

b) Desarrolle la función imprimirResultados(codigoPersona, dicPersonas, aceptacionMinimo, aceptacionMaximo) que genera un un archivo codigoPersona.txt, con el reporte de compatibilidad de la codigoPersona con las de género opuesto en el diccionario.

Cada línea del archivo tiene el formato siguiente:

codigo$Nombre$Caracteristica1,caracteristica2, ... $indiceTanimoto$textoCompatibilidad\n

Donde textoCompatibilidad es ‘aceptar‘ si el índice de Tanimoto está entre los niveles de aceptación mínimo y máximo, sino tiene la palabra ‘rechazar‘.

c) Elabore la  función compatibles(codigoPersona, dicPersonas, aceptacion) que a partir de un codigoPersona y considerando el nivel de aceptación, genera un reporte de emparejamiento en la forma del diccionario «respuesta» .

El diccionario «respuesta» contiene el nombre, caraterísticas, índice de Tanamoto y cantidad de citas fallidas.
El parámetro de aceptación tiene valor por defecto de 0.43,

Ejemplo:
respuesta = {
    'p1001': {'nombre': 'Andrea V.',
              'caracteristicas': {'deportista',
                                  'programador',
                                  'fabuloso',
                                  'farrero'},
              'indice': 0.14,
              'fallidas': 1
              }
    }

Rúbrica: literal a (10 puntos), literal b (13 puntos), literal c (12 puntos)

Referencia: Archivo original 2Eva_IIT2017.pdf