Autor: Edison Del Rosario

  • 1Eva_IIT2018_T1 Prueba de escritorio, listas

    1ra Evaluación II Término 2018-2019, Noviembre 23, 2018. CCPG001

    Tema 1. (20 puntos)

    a. (10 puntos) ¿Qué imprime el siguiente código? Justifique su respuesta

    lista = [89, 45, 23, 17, 55, 95, 13, 41, 28, 11]
    
    lista.sort()
    promedio = sum(lista)//len(lista)
    
    print(promedio)
    
    menores = []
    i = 0
    while lista[i] < promedio:
        menores.append(lista[i])
        i += 1
    
    print(menores)
    

    b. (10 puntos) ¿Qué imprime el siguiente código? Justifique su respuesta

    pal = 'Se van en sus naves'
    
    b     = pal[::-1].replace(' ', '').lower()
    pal_b = pal.lower().replace(' ', '')
    
    if pal_b == b:
        print('Es palíndromo')
    else:
        print('No es palíndromo')
    

    Nota: Asuma que este tema NO tiemen errores de compilación. Si usted cree que hay algún error de compilación, consúltelo inmediatamente con su profesor

  • 3Eva_IT2018_T2 Producción minera del país

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

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

    Tema 2. (50 puntos) En el último discurso presidencial, se mencionaron algunos datos sobre las ganancias de algunos minerales del país que llamaron la atención de los ciudadanos.

    http://www.pichinchauniversal.com.ec/sector-minero-sera-un-gran-aportador-economico/
    http://www.pichinchauniversal.com.ec/sector-minero-sera-un-gran-aportador-economico/

    Suponga que tiene todo el texto del discurso con el formato en minúsculas,  las palabras separadas por un espacio, sin signos de puntuacion ni otros símbolos. Los minerales están identificados por el prefijo "mral_" seguido del nombre del mineral. Por ejemplo: 'mral_oro', 'mral_plata', 'mral_cobalto'

    discurso = '... y el dia de ayer descubrimos en la mina mirador que la cantidad de mral_oro ...'

    a) Implemente la función extraerMinerales(discurso) que al recibir el texto del discurso encuentra los nombres de todos los minerales mencionados. El resultado es una lista con los nombres de los minerales que empiezan con mayúscula y no se repiten en la lista.

    Por otro lado, suponque que dispone de las tablas de producción para cada mineral de las canteras del país, costos totales de extracción, costos totales de transporte, los nombres de los minerales y minas asociados a las filas y columnas de las tablas, y los precios cada mineral, semejantes a los mostrados al final del ejercicio.
    Con ésta información implemente las siguiente funciones:

    b) La función calcularGanancias(P,C,T,precios)  que calcula las ganancias o pérdidas de cada mineral por mina. La función recibe la lista de precios de venta de los minerales las tres matrices: producción (P) , costos totales de extracción (C) y costos totales de transporte (T).

    Adicionamente, considere las siguientes fórmulas:

    ganancia = ventas - costos
    ventas = producción*precio
    costos = costos de transporte + costo de extracción

    c) La función gananciaTotal(M, Minerales) determina las ganancias totales de cada mineral de mayor a menor, junto a los correspondientes nombres de mineral.

    La función recibe la matriz del literal anterior y la lista de las etiquetas de los minerales (fila de la matriz).
    El resultado es una tupla de dos elementos ordenados por ganancia:
    - el vector de Numpy de las ganancias totales por mineral
    - una lista con los nombres de los minerales.

    d) La función top8(discurso, ganatotal) presenta los nombres de los ocho (8) minerales que generaron más ganancias totales  y que fueron mencionados en el discurso. La variable ganatotal corresponde al resultado de la función del literal anterior.

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

    Datos de prueba:
    
    minerales = ['Oro', 'Plata', 'Cobre']
    precios   = [38.48,    3.43,    0.01]
    
    minas = ['MIRADOR', 'FRUTA_DEL_NORTE', 'LOMA_LARGA', 'otra']
    
    # produccion
    P = np.array([[ 13524000, 121072000,  1204000,  9632000],
                  [ 28000000,    952000,  9632000, 96404000],
                  [126980000,    896000, 92988000,  9604000]])
    
    # costos totales de extracción
    C = np.array([[12.32, 10.23, 23.23, 19.23],
                  [ 3.13,  1.78,  2.45,  1,69],
                  [ 8.32,  5.25,  6.32,  6.89]])
    
    # costos totales de transporte
    T = np.array([[ 43736616, 341786256,  5442080,  28241024],
                  [ 76244000,   1827840, 13966400, 435746080],
                  [156439360,   1121792,300723192,  10785292]])
    

    Referencia: Archivo original 3raEvaI_Term2018.pdf

  • s3Eva_IT2018_T2 Producción minera del país

    Ejercicio: 3Eva_IT2018_T2 Producción minera del país

    Algoritmo en Python

    Solución propuesta en Python, el primer bloque corresponde solo a las funciones requeridas en el examen. El segundo bloque corresponde a un programa de prueba.

    # CCPG1001-Fundamentos de Programación - FIEC-ESPOL
    # 3Eva_IT2018_T2 Producción minera del país
    import numpy as np
    
    # Literal a
    def extraerMinerales(discurso): 
        palabras = discurso.split(' ')
        cuales   = []
    
        for unapalabra in palabras:
            # Tarea: verificar únicos
            if 'mral_' in unapalabra:
                mencionados = unapalabra[5:]
                mencionados = mencionados.title()
                cuales.append(mencionados)
    
        return(cuales)
    
    # literal b
    def calcularGanancias(P,C,T,precios):
        produccion = np.array(P)
        costosExtraccion = np.array(C, dtype=float)
        costosTransporte = np.array(T)
        
        # precio en forma de columna
        precios = np.transpose([precios])
    
        ventas = produccion*precios
        costo = costosTransporte + costosExtraccion
        ganancia = ventas - costo
        return(ganancia)
    
    # literal c
    def gananciaTotal(ganancia, minerales):
        ganametal = np.sum(ganancia,axis =1)
        
        ascendente  = np.argsort(ganametal)
        descendente = np.argsort(-ganametal)
    
        totalmetal  = ganametal[descendente]
        
        # convierte arreglo para ascendente
        minerales = np.array(minerales)
        cualmetal = minerales[descendente]
    
        ganatotal = (totalmetal,list(cualmetal))
    
        return(ganatotal)
    
    # literal d
    def top8(discurso,reporte):
        mencionados = extraerMinerales(discurso)
        totalmetal  = reporte[0]
        cualmetal   = reporte[1]
        
        interseccion = []
        m = len(cualmetal)
        for i in range(0,m,1):
            if (cualmetal[i] in mencionados):
                interseccion.append(cualmetal[i])
                
        mejoresmencionados = interseccion[:8]
        return (mejoresmencionados)
    

    Programa de Prueba

    Observación: las matrices C y T no tienen el mismo orden de magnitud a pesar de ser costos totales. Podría ser que el costo de extracción C sea por gramos, sin embargo las matrices se usan tal como fueron presentadas en el examen

    # CCPG1001-Fundamentos de Programación - FIEC-ESPOL
    
    # PROGRAMA DE PRUEBA -----
    discurso  = 'y el dia de ayer descubrimos en la mina mirador que la cantidad de mral_oro'
    
    minerales = ['Oro', 'Plata', 'Cobre']
    precios   = [38.48,    3.43,    0.01]
    
    minas = ['MIRADOR', 'FRUTA_DEL_NORTE', 'LOMA_LARGA', 'otra']
    
    
    P = [[ 13524000, 121072000,  1204000,  9632000],
         [ 28000000,    952000,  9632000, 96404000],
         [126980000,    896000, 92988000,  9604000]]
    
    C = [[ 12.32, 10.23, 23.23, 19.23],
         [  3.13,  1.78,  2.45,  1.69],
         [  8.32,  5.25,  6.32,  6.89]]
    
    T = [[ 43736616, 341786256,  5442080,  28241024],
         [ 76244000,   1827840, 13966400, 435746080],
         [156439360,   1121792,300723192,  10785292]]
                
    # PROCEDIMIENTO
    mencionados = extraerMinerales(discurso)
    
    ganancias  = calcularGanancias(P,C,T,precios)
    
    ganatotal  = gananciaTotal(ganancias, minerales)
    totalmetal = ganatotal[0]
    cualmetal  = ganatotal[1]
    
    mejoresmencionados = top8(discurso,ganatotal)
    
    
    # SALIDA
    print('a) los minerales mencionados son: ')
    print(mencionados)
    
    print('b) las ganancias totales son:')
    print(ganancias)
    
    print('c) ganancias totales por metal')
    print(totalmetal)
    print(cualmetal)
    
    print('d) los 8 mejores mencionados: ')
    print(mejoresmencionados)
    

    los resultados en pantalla son :

    a) los minerales mencionados son: 
    ['Oro']
    b) las ganancias totales son:
    [[  4.76666892e+08   4.31706429e+09   4.08878168e+07   3.42398317e+08]
     [  1.97959969e+07   1.43751822e+06   1.90713576e+07  -1.05080362e+08]
     [ -1.55169568e+08  -1.11283725e+06  -2.99793318e+08  -1.06892589e+07]]
    c) ganancias totales por metal
    [  5.17701732e+09  -6.47754890e+07  -4.66764983e+08]
    ['Oro', 'Plata', 'Cobre']
    d) los 8 mejores mencionados: 
    ['Oro']
    >>> 
    
  • 3Eva_IT2018_T3 Prueba de escritorio, listas, conjuntos

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

    Tema 3. (10 puntos) Indique la salida por pantalla del siguiente código. Justifique su respuesta.

    lista1 = ["A", "e", "a", "b", "a", "D"]
    lista2 = ["E", "b", "a", "m", "d"]
    
    lista3 = []
    
    for elemento in lista1:
        if elemento not in lista2:
            lista3.append(elemento)
    
    print(set(lista2).difference(lista3))
    
    print(set(lista3).union(lista1))
    
    print(set(lista2).symmetric_difference(lista1))
    

    Referencia: Archivo original 3raEvaI_Term2018.pdf

  • s3Eva_IT2018_T3 Prueba de escritorio, listas, conjuntos

    Ejercicio: 3Eva_IT2018_T3 Prueba de escritorio, listas

    Listas, conjuntos en Python, data set, unión, diferencia, diferencia simétrica, lazos, condicionales.

  • 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

  • s3Eva_IT2018_T1 Choferes y Rutas Trailers

    Ejercicio: 3Eva_IT2018_T1 Choferes y Rutas Trailers

    Propuesta en Python, se incluye la función calcularFecha() se presenta para poder probar las funciones en el programa de prueba.

    El archivo con datos de prueba usado es: rutasManejadas2018.txt

    La propuesta considera el uso de listas, por ser parte de los ejercicios del proyecto para 3ra Evaluación.

    Algoritmo en Python

    # CCPG1001-Fundamentos de Programación - FIEC-ESPOL
    # 3Eva_IT2018_T1 Choferes y Rutas Trailers
    
    # literal a
    def cargarDatos(narchivo):
        loschoferes = []
        tabla = {}
        
        archivo  = open(narchivo,'r')
        cabecera = archivo.readline()
        linea = archivo.readline()
        while not(linea==''):
            linea  = linea.strip('\n')
            partes = linea.split(',')
            ruta   = partes[0]
            chofer = partes[1]
            fecha  = partes[2]
            
            if not(chofer in loschoferes):
                loschoferes.append(chofer)
    
            if not(fecha in tabla):
                tabla[fecha] = {ruta:[chofer]}
            else:
                if not(ruta in tabla[fecha]):
                    tabla[fecha][ruta] = [chofer]
                else:
                    tabla[fecha][ruta].append(chofer)
                    
            linea = archivo.readline()
            
        archivo.close()
    
        return((loschoferes,tabla))
    
    # función para pruebas, no requerida en la evaluación
    import datetime as dtt
    
    def calcularFecha(unafecha,n):
        formato = '%d-%m-%Y'
        fecha   = dtt.datetime.strptime(unafecha,formato)
        pasada  = fecha - dtt.timedelta(days=n)
        pasadatxt = dtt.datetime.strftime(pasada,formato)
        return(pasadatxt)
    
    # literal b
    def encontrarChoferes(tabla,loschoferes,unafecha,unaruta,n):
        simanejaron = []
        fechas = list(tabla.keys())
        for i in range(1,n+1,1):
            pasada = calcularFecha(unafecha,i)
            if (pasada in fechas):
                trabajaron = tabla[pasada][unaruta]
                for unchofer in trabajaron:
                    if not(unchofer in simanejaron):
                        simanejaron.append(unchofer)
        nomanejaron = []
        for unchofer in loschoferes:
            if not(unchofer in simanejaron):
                nomanejaron.append(unchofer)
        return(nomanejaron)
    
    # literal c
    def grabarArchivo(tabla,loschoferes,unafecha,n):  
        narchivograba = unaruta+'_'+unafecha+'_'+str(n)+'.txt'
        
        archivo = open(narchivograba,'w')
        
        cabecera = 'Para la ruta '+unaruta+'\n'
        cabecera = cabecera + 'los choferes disponibles para la fecha '+unafecha+'\n'
        cabecera = cabecera + 'que no hayan manejado '+str(n)+' dias anteriores son: \n'
        archivo.write(cabecera)
        
        nomanejaron = encontrarChoferes(tabla,loschoferes,unafecha,unaruta,n)
    
        for cadachofer in nomanejaron:
            archivo.write(cadachofer+'\n')
        archivo.close()
        
        return(narchivograba)
    

    programa de prueba, como trabajo extra, no requerido para el examen:

    # CCPG1001-Fundamentos de Programación - FIEC-ESPOL
    # PROGRAMA PRUEBA -------
    # INGRESO
    narchivo = 'rutasManejadas2018.txt'
    unafecha = '19-05-2018'
    unaruta = 'Guayaquil-Cuenca'
    n = 2
    
    # PROCEDIMIENTO
    datos = cargarDatos(narchivo)
    loschoferes = datos[0]
    tabla = datos[1]
    nomanejaron = encontrarChoferes(tabla,loschoferes,unafecha,unaruta,n)
    elarchivo = grabarArchivo(tabla,loschoferes,unafecha,n)
    
    # SALIDA
    print('a) los choferes registrados son: ')
    print(loschoferes)
    print('   la tabla de trabajos es: ')
    print(tabla)
    print('b) los choferes que no manejaron en ')
    print('  '+unaruta+', '+str(n)+' dias antes del '+unafecha+': ')
    print(nomanejaron)
    print('c) resultados en el archivo: ', elarchivo)
    

    Se muestra el resultado en pantalla del programa usando los datos de prueba del archivo:

    a) los choferes registrados son: 
    ['SMS', 'AGB', 'SMZ', 'EVN', 'AAQ']
       la tabla de trabajos es: 
    {'17-05-2018': {'Guayaquil-Cuenca': ['SMS', 'SMZ'], 'Guayaquil-Daule': ['EVN']}, '18-05-2018': {'Guayaquil-Cuenca': ['AGB'], 'Guayaquil-Daule': ['AAQ']}}
    
    b) los choferes que no manejaron en 
      Guayaquil-Cuenca, 2 dias antes del 19-05-2018: 
    ['EVN', 'AAQ']
    
    c) resultados en el archivo:  Guayaquil-Cuenca_19-05-2018_2.txt
    >>> 
    
  • s2Eva_IT2016_T1 Tendencias en Twitter

    Ejercicio: 2Eva_IT2016_T1 Tendencias en Twitter

    Propuesta de solución en Python:

    # CCPG1001-Fundamentos de programación FIEC-ESPOL
    # 2Eva_IT2016_T1 Tendencias en Twitter
    
    def reportatendencia(tendencias,fecha1,fecha2):
        etiquetasf1 = tendencias[fecha1]
        n = len(etiquetasf1)
        etiquetasf2 = tendencias[fecha2]
        m = len(etiquetasf2)
        difsimetrica =[]
        i = 0
        while not(i>=n):
            # TAREA
    
            i = i + 1  
        return(difsimetrica)
    
    def cuentaTopics(tendencias, listaFechas):
        fechaslista = list(listaFechas)
        n = len(fechaslista)
        union = {}
        i = 0
        while not(i>=n):
            etiquetas = tendencias[fechaslista[i]]
            etiquetas = list(etiquetas)
            m = len(etiquetas)
            j = 0
            while not(j>=m):
                if not(etiquetas[j] in union):
                    union[etiquetas[j]]=0
                j = j + 1
            i = i + 1
            
        # contadores
        i = 0
        while not(i>=n):
            etiquetas = tendencias[fechaslista[i]]
            etiquetas = list(etiquetas)
            m = len(etiquetas)
            j = 0
            while not(j>=m):
                cual = etiquetas[j]
                union[cual] = union[cual] + 1
                j = j + 1
            i = i + 1
    
        return(union)
    
    tendencias = {
        '08-22-2016':{'#Rio2016', '#BSC', '#ECU'},
        '08-25-2016':{'#GYE', '#BRA'},
        '08-27-2016':{'#YoSoyEspol', '#GYE', '#BSC'}
        }
    
    listaFechas = ['08-22-2016','08-27-2016']
    # PROCEDIMIENTO
    cuales = cuentaTopics(tendencias, listaFechas)
    
    print(cuales)
    
  • s2Eva_IT2018_T2 Pago nomina mensual

    Ejercicio: 2Eva_IT2018_T2 Pago nomina mensual

    Propuesta de solución en Python:

    archivo de prueba: meshoratrabajada.txt

    # CCPG1001-Fundamentos de programación FIEC-ESPOL
    # 2Eva_IT2018_T2 Pago nomina mensual
    # Propuesta modo simple pero larga
    # Tarea: Proponer simplificaciones a los algoritmos
    
    def calcularHoras(linea):
        linea  = linea.strip('\n')
        partes = linea.split(',')
        fecha  = partes[0]
        dia = int(partes[1])
        esferiado = partes[2]
        ID = partes [3]
        nombre   = partes[4]
        sucursal = partes[5]
        ciudad   = partes[6]
        horas    = int(partes[7])
    
        trabajado = [ID,ciudad, 0,0,0,0]
        if (esferiado=='Si'):
            trabajado[5] = horas
        else:
            if (dia>=6):
                trabajado[4] = horas
            else:
                if (horas<=8):
                    trabajado[2] = horas
                else:
                    trabajado[2] = 8
                    trabajado[3] = horas-8
        return(trabajado)
    
    def leerData(nomA):
        
        total = {}
        archivo = open(nomA,'r')
        # factores
        linea = archivo.readline()
        linea = linea.strip('\n')
        partes = linea.split(',')
        VH = float(partes[1])
        
        linea = archivo.readline()
        linea = linea.strip('\n')
        partes = linea.split(',')
        
        HR = float(partes[1])
        linea = archivo.readline()
        linea = linea.strip('\n')
        partes = linea.split(',')
        
        HER = float(partes[1])
        linea = archivo.readline()
        linea = linea.strip('\n')
        partes = linea.split(',')
        
        HFDS = float(partes[1])
        linea = archivo.readline()
        linea = linea.strip('\n')
        partes = linea.split(',')
        HF = float(partes[1])
        
        # encabezado
        linea = archivo.readline()
        
        # datos    
        linea = archivo.readline()
        parafecha = linea.split(',')
        parafecha = parafecha[0].split('-')
        mes = parafecha[1]
        anio = parafecha[2]
        
        while not(linea==''):
            trabajado = calcularHoras(linea)
            ID = trabajado[0]
            ciudad = trabajado[1]
            normal = trabajado[2]*VH*HR
            extra = trabajado[3]*VH*HER
            finsem = trabajado[4]*VH*HFDS
            feriado = trabajado[5]*VH*HF
            
            if not(ciudad in total):
                total[ciudad] = {ID:{'HR': normal,
                                    'HER': extra,
                                    'HFDS': finsem,
                                    'HF': feriado}}
            else:
                if not(ID in total[ciudad]):
                    total[ciudad][ID] = {'HR': normal,
                                         'HER': extra,
                                         'HFDS': finsem,
                                         'HF': feriado}
                else:
                    total[ciudad][ID]['HR'] = total[ciudad][ID]['HR'] + normal
                    total[ciudad][ID]['HER'] = total[ciudad][ID]['HER'] + extra
                    total[ciudad][ID]['HFDS'] = total[ciudad][ID]['HFDS'] + finsem
                    total[ciudad][ID]['HF'] = total[ciudad][ID]['HF'] + feriado
            linea = archivo.readline()     
        
        archivo.close()
        pagonomina = (total,mes,anio)
        return(pagonomina)
    
    def generareporte(nomA):
        pagonomina = leerData(nomA)
        total  = pagonomina[0]
        mes    = pagonomina[1]
        anio   = pagonomina[2]
        ciudad = list(total.keys())
        
        for lugar in ciudad:
            narchivo = lugar+mes+'-'+anio+'.txt'
            archivo  = open(narchivo,'w')
            registro = total[lugar]
            # Tarea: Poner encabezado
            
            for empleado in registro:
                linea = empleado +','+str(total[lugar][empleado]['HR'])
                extra = total[lugar][empleado]['HER']+ total[lugar][empleado]['HFDS'] +total[lugar][empleado]['HF']
                linea = linea+','+str(extra)+'\n'
                archivo.write(linea)
                
            archivo.close()
        mensaje = 'archivo guardado'
        return(mensaje)
    
    # PROGRAMA PRUEBA -------------------
    # INGRESO
    nomA = 'meshoratrabajada.txt'
    
    # PROCEDIMIENTO
    mensaje = generareporte(nomA)
    
    # SALIDA
    print(mensaje)
    
  • 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