Autor: Edison Del Rosario

  • 2Eva_IT2016_T3 Funciones búsqueda y suma

    2da Evaluación I Término 2016-2017. Agosto 30, 2016 /CCPG001

    TEMA 3 (10 PUNTOS)

    a) Implemente una función buscar(listaAnidada, valor) que recibe una lista de listas y retorna verdadero o falso (True o False, 1 o 0) si valor existe en listaAnidada.

    b) Utilice la función buscar del literal a para determinar si un valor existe en una lista anidada y mostrar por pantalla ‘Valor si existe’ o ‘Valor no existe’.

    c) Implemente una función que sume o multiplique valores en una lista anidada.

    - Si se invoca a la función únicamente con la lista como argumento, la función debe retornar la suma de los valores.

    - Si se invoca a la función con un segundo argumento con valor ‘multiplicar’, la función debe retornar la multiplicación de los valores.

    - Para cualquier otro valor para el segundo argumento, la función deberá retornar -1.

    Rúbrica: literal a (2.5 puntos), literal b(2.5 puntos), literal c (5 puntos)

    Referencia: Archivo original 2Eva_IT2016.pdf

  • 2Eva_IT2016_T2 Distancias entre ciudades de Ecuador

    2da Evaluación I Término 2016-2017. Agosto 30, 2016 /CCPG001

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

    TEMA 2. (60 PUNTOS) Las distancias entre ciudades del Ecuador conectadas directamente por una carretera están almacenadas en el archivo ‘Ecuador_Distancias.txt‘ con el siguiente formato:

    Ciudad_de_Partida|Ciudad,Distancia|Ciudad,Distancia|...|Ciudad,Distancia
    
    Por ejemplo:
    Ambato|Azogues,280|Babahoyo,212|Pedernales,318
    Azogues|Pedernales,555|Babahoyo,125
    Pedernales|Ambato,318|Azogues,555
    Babahoyo|Ambato,250
    ...

    Implemente las siguientes funciones:

    a) cargarDatos(nombreArchivo) que recibe el nombre del archivo como string y retorna el diccionario distancias con el siguiente formato:

    distancias = {
     'Ambato':{'Azogues':280,'Babahoyo':212,'Pedernales':318},
     'Azogues':{'Pedernales':555,'Babahoyo':125},
     'Babahoyo':{'Ambato':250} 
     }

    b) ciudadesCercanas(distancias, km) donde distancias es el diccionario generado en el literal a) y km es un valor entero positivo . La función retorna una lista de tuplas con todos los pares de ciudades conectadas directamente por una carretera que estén a una distancia menor o igual que el valor de km.
    La tupla incluye los valores de ‘ciudad1’, ‘ciudad2’, ‘distancia’ que las separa. Por ejemplo:

    >>> ciudadesCercanas(distancias,300) 
    retorna: 
    [('Ambato','Azogues',280), ('Ambato','Babahoyo',212), 
     ('Azogues','Babahoyo',125), ('Babahoyo','Ambato',250)]

    c)  guardarCiudadesCercanas(distancias, listaKms) que recibe el diccionario de distancias y una lista con varias distancias en kilómetros, para generar un archivo con las ciudades separadas a máximo dicha distancia. Por ejemplo:

    >>>guardarCiudadesCercanas(distancias, [300, 100, 250]) 
    genera los siguientes tres archivos: 
    ciudades300.txt, 
    ciudades100.txt, 
    ciudades250.txt.

    El archivo ‘ciudades300.txt’ tendría el siguiente contenido:

    Ambato,Azogues,280
    Ambato,Babahoyo,212
    Azogues,Babahoyo,125
    Babahoyo,Ambato,250

     

  • 2Eva_IT2016_T1 Tendencias en Twitter

    2da Evaluación I Término 2016-2017. Agosto 30, 2016 /CCPG001

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

    Tema 1. (30 PUNTOS) Una tabla denominada tendencias, usada en forma de diccionario, contiene una fecha como clave y un conjunto de etiquetas que representan los tópicos o temas que fueron tendencia en la red social de Twitter.
    Por ejemplo:

    >>> tendencias = {
     '08-22-2016':{'#Rio2016', '#BSC', '#ECU'}, 
     '08-25-2016':{'#GYE', '#BRA'}, 
     '08-27-2016':{'#YoSoyEspol', '#GYE', '#BSC'}
     }

    Implemente las siguientes funciones:

    a) cuentaTopics(tendencias, listaFechas) que recibe el diccionario de tendencias y una lista de fechas en formato tipo texto (mm-dd-aaaa).
    La función retorna un nuevo diccionario con la etiqueta o hashtag(#) como clave y el número de días que la etiqueta fue tendencia en los días de la lista de fechas. Por ejemplo:

    >>> cuentaTopics(tendencias,['08-22-2016', '08-25-2016', '08-27-2016']) 
    
    {'#Rio2106':1, 
     '#GYE':2, 
     '#YoSoyEspol':1, 
     '#BSC':2, 
     '#ECU':1, 
     '#BRA':1}

    b) reportaTrending(tendencias, listaFechas) que recibe los datos del literal anterior y muestre en pantalla:
    b.1) Las etiquetas que fueron tendencia en todos los días en listaFechas
    b.2) Las etiquetas que fueron tendencia en al menos uno de los días en listaFechas

    c) reportaTrending(tendencias, fecha1, fecha2) que recibe el diccionario de tendencias y dos fechas (mm-dd-aaaa), para mostrar por pantalla las etiquetas que fueron tendencia o en fecha1 o en fecha2, pero no en las dos.

  • s1Eva_IT2016_T2 historial de visitas web

    Ejercicio: 1Eva_IT2016_T2 historial de visitas web

    literal a. Se obtiene un registro de los sitios visitados, para luego separar sus partes entre empleado|sitio|duracion.

    Para los sitios que no son de trabajo se usa una lista llamada ocio. Si el sitio visitado no se encuentra en trabajo, se añade a la lista ocio. Se considera revisar que la lista no tenga elementos repetidos

    # a) sitios que no son de trabajo
    ocio = []
    n = len(visitados)
    i = 0
    while not(i>=n):
        registro = visitados[i]
        partes = registro.split('|')
        sitio  = partes[1]
        if not(sitio in trabajo):
            if not(sitio in ocio):
                ocio.append(sitio)
        i = i + 1
    

    literal b. Par contabilizar el tiempo por empleado se acumula en una lista los tiempos de navegación, usando la posición del empleado en la lista obtenida con la instrucción empleados.index(quien)

    # b) tiempo de internet/empleado
    m = len(empleados)
    tiempo = np.zeros(m,dtype=int)
    
    n = len(visitados)
    i = 0
    while not(i>=n):
        registro = visitados[i]
        partes = registro.split('|')
        quien  = partes[0]
        indice = empleados.index(quien)
        cuanto = int(partes[2])
        tiempo[indice] = tiempo[indice] + cuanto
        i = i + 1
    

    Se procede de forma semejante para obtener una tabla de tiempos por sitio.

    Una respuesta que se pude obtener de la tabla anterior es la búsqueda del empleado más ocioso, el que ha usado más tiempo en sitios de ocio. (tema 3, literal f)


    Algoritmo en Python

    # CCPG1001 Fundamentos de Programación FIEC-ESPOL
    # 1Eva_IT2016_T2 historial de visitas web
    import numpy as np
    
    # INGRESO
    visitados = [ 'maria2|www.facebook.com|160',
                  'xavi7|www.eluniverso.com|50',
                  'jose15|www.sri.gob.ec|30',
                  'maria2|www.twitter.com|30',
                  'xavi7|www.inec.gob.ec|10',
                  'maria2|www.espol.edu.ec|50',
                  'jose15|www.sri.gob.ec|120',
                  'xavi7|www.sri.gob.ec|20',
                  'maria2|www.twitter.com|20',]
    empleados = ['maria2',
                 'jose15',
                 'xavi7']
    trabajo = ['www.espol.edu.ec',
               'www.inec.gob.ec',
               'www.sri.gob.ec']
    
    # PROCEDIMIENTO
    
    # a) sitios que no son de trabajo
    ocio = []
    n = len(visitados)
    i = 0
    while not(i>=n):
        registro = visitados[i]
        partes = registro.split('|')
        sitio  = partes[1]
        if not(sitio in trabajo):
            if not(sitio in ocio):
                ocio.append(sitio)
        i = i + 1
    
    # b) tiempo de internet/empleado
    m = len(empleados)
    tiempo = np.zeros(m,dtype=int)
    
    n = len(visitados)
    i = 0
    while not(i>=n):
        registro = visitados[i]
        partes = registro.split('|')
        quien  = partes[0]
        indice = empleados.index(quien)
        cuanto = int(partes[2])
        tiempo[indice] = tiempo[indice] + cuanto
        i = i + 1
    
    # b) tiempo de internet por empleado/sitio. matrices
    k = len(visitados)
    n = len(empleados)
    todositio = trabajo + ocio
    m = len(todositio)
    tabla = np.zeros(shape=(n,m), dtype=int)
    
    i = 0
    while not(i>=k):
        registro = visitados[i]
        partes = registro.split('|')
        quien  = partes[0]
        fila   = empleados.index(quien)
        donde  = partes[1]
        columna = todositio.index(donde)
        cuanto = int(partes[2])
        tabla[fila,columna] = tabla[fila,columna] + cuanto
        i = i+1
    
    # Tema 3. f)
    # empleado es mas ocioso
    parte = tabla[:,len(trabajo):]
    ocioempleado = np.sum(parte, axis =1)
    masocioso = np.argmax(ocioempleado)
    quien = empleados[masocioso]
    
    # SALIDA
    print('sitios de ocio: ')
    print(ocio)
    print('tiempos por empleado: ')
    print(tiempo)
    print('tabla de tiempos: ')
    print(tabla)
    print('empleado mas ocioso: ', quien) 
    

    resultado del algoritmo

    sitios de ocio: 
    ['www.facebook.com', 'www.eluniverso.com', 'www.twitter.com']
    tiempos por empleado: 
    [260 150  80]
    tabla de tiempos: 
    [[ 50   0   0 160   0  50]
     [  0   0 150   0   0   0]
     [  0  10  20   0  50   0]]
    empleado mas ocioso:  maria2
    >>> 
    
  • 3Eva_IT2016_T3 Prueba de escritorio - funciones, listas, caracteres

    3ra Evaluación I Término 2016-2017, Septiembre 13, 2016 /CCPG001

    Tema 3. (10 puntos)
    a) (5 puntos) Considere lo siguiente e indique el resultado al ejecutarlo. Justifique su respuesta.

    lista1 = [3,'A',6]
    lista2 = ['A']
    
    def funcion (lista1, lista2):
        a = []
        for i in lista1:
            for j in lista2:
                if i != j:
                    a.append(str(i) + str(j))
                    for x in a[:]:
                        a.append(str(i) + str(j))
        return(a)
    
    print(funcion (lista1, lista2))
    

    b) (5 puntos) Considere lo siguiente e indique el resultado al ejecutarlo. Justifique su respuesta.

    def fun(cadena,k):
        L = []
        for elem in set(cadena.split(' ')):
            L.append(elem*k)
        return('#'.join(L))
    
    cadena = 'programar es estupendo estupendo es programar'
    
    print(fun(cadena,2))
    

    Referencia: Archivo original 3Eva_IT2016.pdf

  • s3Eva_IT2016_T3 Prueba de escritorio - funciones, listas, caracteres

    Ejercicio: 3Eva_IT2016_T3 Prueba de escritorio - funciones, listas, caracteres

    funciones, listas, lazos, condicionales, caracteres

    a) (5 puntos) Considere lo siguiente e indique el resultado al ejecutarlo. Justifique su respuesta.

    lista1 = [3,'A',6]
    lista2 = ['A']
    
    def funcion (lista1, lista2):
        a = []
        for i in lista1:
            for j in lista2:
                if i != j:
                    a.append(str(i) + str(j))
                    for x in a[:]:
                        a.append(str(i) + str(j))
        return(a)
    
    print(funcion (lista1, lista2))
    

  • 3Eva_IT2016_T2 sensar cultivos con dron

    3ra Evaluación I Término 2016-2017, Septiembre 13, 2016 /CCPG001

    Tema 2. (50 puntos) Una empresa agrícola ha decidido integrar un dron (avión no tripulado) para monitorear el crecimiento de los cultivos en una de sus plantaciones con dimensión rectangular de MxN .

    drone agricola

    Referencia: “Drones vuelan para ver el estado de los cultivos”. eluniverso.com. 7 de febrero, 2015.

    El dron usado puede de sensar el número de cultivos en una posicion=[i,j] usando una funcion sensarCultivos(posicion) que mueve el dron a la posición dada por una tupla y retorna un valor entero correspondiente al número de cultivos sensados.

    Suponga que ésta función ya existe, por lo tanto no necesita ser implementada en el examen.

    A partir de la información anterior, implemente las siguientes funciones:

    a) generarplantacion(dimension) que recibe una tupla dimension=[M,N] de la plantación y procede a sensar los cultivos utilizando la funcion sensarcultivos(posicion) para cada una de las posiciones. Se obtiene una matriz plantacion con los valores del número de cultivos en cada posicion=[fila,columna].

    b) analizarDensidad(plantacion, limite) que calcula una matriz con los grados de crecimiento de la plantación. La función recibe la matriz plantación del literal a y un límite que representa un parametro para determinar la densidad en una posicion. Una posición es considerada con crecimiento ‘BAJO‘ si tiene menos que el límite de cultivos, caso contrario se considera de crecimiento ‘ALTO‘. Al definir la función considere que el valor predeterminado del límite es 4. Ejemplo:

    plantacion=[[5,3,2],
                [1,4,8],
                [2,3,1]]
    
    >>analizaDensidad(plantacion)
    retorna:
    [['ALTO','BAJO','BAJO'],
     ['BAJO','ALTO','ALTO'],
     ['BAJO','BAJO','BAJO']]

    c) reporteCrecimento(plantacion,densidad) recibe las matrices de los literales a y b. Suponga que “surco” es equivalente a una fila de la matriz, y “parcela” es equivalente a una columna del surco. La función debe retornar una tupla de tres elementos con la siguiente información:

    • los promedios de los cultivos por surcos
    • las posiciones, relativas a cada surco, de las parcelas que tienen mayor número de cultivos en dicho surco.
    • los promedios de cultivos de las parcelas para los grados de crecimiento ‘ALTO’ Y ‘BAJO’.

    Por ejemplo, usando las matrices anteriores:

    >>> reporteCrecimiento(plantacion,densidad)
    retorna:
    ([3.33333333, 4.33333333, 2.0], [0, 2, 1], [5.66667, 2.0]

    Como referencia un ejemplo de un surco:

    surco[0] = [parcela0, parcela1, parcela2]
    

    Referencia: Archivo original 3Eva_IT2016.pdf

  • 3Eva_IT2016_T1 Costo de mensaje

    3ra Evaluación I Término 2016-2017, Septiembre 13, 2016 /CCPG001

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

    Tema 1. mensaje de texto sms(40 puntos) Una empresa de telecomunicaciones determina el costo para enviar un mensaje como el acumulado de los valores de cada palabra diferenciadas por tamaño y tipo:

    • una palabra corta tiene máximo M caracteres,
    • una palabra larga tiene mas de M caracteres,
    • una palabra especial es un verbo en infinitivo, es decir, palabras terminadas en ‘ar‘, ‘er, ‘ir‘ , sin importar su tamaño.

    Implemente las siguientes funciones:

    a) cargarDatos(nombreArchivo) que recibe el nombre del archivo que en lineas separadas especifica: el tamaño M, el costo de las palabras cortaslargas e infinitivos. La función abrirá el archivo y retorna un diccionario de la forma:

    nombreArchivo='costos.txt'
    10
    0.2
    0.5
    0.3
    
    >>> cargarDatos('costos.txt')
    retorna:
    {'M':10, 'corta':0.2, 'larga':0.5, 'infinitivo':0.3}

    b) calcularCostos(datos, nombreArchivo) es una función que determina el costo total de un mensaje guardado en un archivo.
    La variable datos corresponde al diccionario de datos generado en el literal a) y un nombre de archivo con el texto de varias lineas correspondiente al mensaje guardado. Las palabras de cada línea se encuentran separadas por espacios y un punto ‘.’ al final del mensaje como único signo de puntuación presente. El punto ‘.’ no deberá ser considerado para determinar el costo de esa última palabra.

    c) cambiarMensaje(datos, nombreArchivo1, nombreArchivo2) es una función que baja el costo del mensaje al modificarlo mediante:

    • el recorte de las palabras largas a M-1 caracteres y  colocando ‘#‘ al final.
    • el reemplazo el punto final ‘.’ con la palabra especial ‘END’.

    La función recibe el diccionario de datos generado en el literal a) y dos nombres de archivos: nombreArchivo1 que contiene el mensaje y nombreArchivo2 que es el el archivo que se crea (guarda) con el mensaje modificado.

    Referencia: Archivo original 3Eva_IT2016.pdf

  • S3Eva_IT2016_T2 sensar cultivos con dron

    Ejercicio: 3Eva_IT2016_T2 sensar cultivos con dron

    Propuesta de solución en Python:

    # CCPG1001-Fundamentos de Programación - FIEC-ESPOL
    # 3Eva_IT2016_T2 sensar cultivos con dron
    import numpy as np
    import random as rnd
    
    def  sensarCultivos(posicion):
        # Solo para generar una matriz que
        # permita trabajar con el programa
        valor = int(rnd.random()*10+1)
        return(valor)
    
    def generarplantacion(dimension):
        n = dimension[0]
        m = dimension[1]
        plantacion = np.zeros(shape=(n,m),dtype=int)
        i = 0
        while not(i>=n):
            j = 0
            while not(j>=m):
                posicion = [i,j]
                valor = sensarCultivos(posicion)
                plantacion[i,j] = valor
                j = j + 1
            i = i + 1
        return(plantacion)
    
    # usa matriz densidad de 1 y 0 para facilitar 
    # el cálculo del literal c
    def analizarDensidad(plantacion, limite):
        tamano = np.shape(plantacion)
        n = tamano[0]
        m = tamano[1]
        densidad  = np.zeros(shape=(n,m),dtype=int)
        resultado = []
        i = 0
        while not(i>=n):
            fila = []
            j = 0
            while not(j>=m):
                if (plantacion[i,j]>=limite):
                    densidad[i,j]=1
                    fila.append('ALTO')
                else:
                    fila.append('Bajo')
                j = j + 1
            resultado.append(fila)
            i = i + 1
        
        return(densidad)
    
    def reporteCrecimento(plantacion,densidad):
        tamano = np.shape(plantacion)
        n = tamano[0]
        m = tamano[1]
        casillas = n*m
        
        sumaALTO = 0
        sumaBAJO = 0
        i = 0
        while not(i>=n):
            j = 0
            while not(j>=m):
                valor = plantacion[i,j]
                if (densidad[i,j]==1):
                    sumaALTO = sumaALTO + valor
                else:
                    sumaBAJO = sumaBAJO + valor
                j = j + 1
            i = i + 1
        prmALTO  = sumaALTO/(np.sum(densidad))
        prmBAJO  = sumaBAJO/(n*m-np.sum(densidad))
        promedio = [prmALTO,prmBAJO]
        return(promedio)
    

    crear un archivo de funciones para importar si las funciones se crean en otro archivo.

    # CCPG1001-Fundamentos de Programación - FIEC-ESPOL
    import dronescultivos as dron
    
    # PROGRAMA
    # INGRESO , usa datos aleatorios como prueba
    dimension = (3,4)
    plantacion = dron.generarplantacion(dimension)
    
    #PROCEDIMIENTO
    limite = 4
    densidad = dron.analizarDensidad(plantacion, limite)
    reporte  = dron.reporteCrecimento(plantacion,densidad)
    
    #SALIDA
    print(plantacion)
    print(densidad)
    print(reporte)
    
  • s2Eva_IIT2016_T1 Multas de Transito por sector

    Ejercicio: 2Eva_IIT2016_T1 Multas de Transito por sector

    Propuesta de solución en Python:

    # CCPG1001-Fundamentos de programación
    # 2Eva_IIT2016_T1 Multas de Transito por sector
    import numpy as np
    
    def generaMatriz(listamultas,sectores):
        n = len(sectores)
        unafila = sectores[0]
        
        m = len(unafila)
        matriz = np.zeros(shape=(n,m),dtype=float)
    
        k = len(listamultas)
        i = 0
        while not(i>=k):
            f = listamultas[i][0]
            c = listamultas[i][1]
            valor = listamultas[i][2]
            matriz[f,c] = matriz[f,c] + valor
            i = i+1
        return(matriz)
    
    def sectorTop(matriz):
        
        # TAREA: Realizar para este y oeste
        tamano = np.shape(matriz)
        n = tamano[0]
        m = tamano[1]
        norte = matriz[0,:]
        sur = matriz[n-1,:]
        centro = matriz[1:3,2]
    
        rnorte  = np.sum(norte)
        rsur    = np.sum(sur)
        rcentro = np.sum(centro)
        
        suma = [rnorte,rsur,rcentro]
        referencia = ['norte','sur','centro']
        
        cual   = np.argmax(suma)
        nombre = referencia[cual]
        valor  = suma[cual]
        respuesta = [nombre,valor]
    
        return(respuesta)
    
    
    # PROGRAMA
    # INGRESO
    sectores = [
        ['Norte','Norte','Norte','Norte','Norte'],
        ['Oeste','Oeste','Centro','Este','Este'],
        ['Oeste','Oeste','Centro','Este','Este'],
        ['Oeste','Oeste','Centro','Este','Este'],
        ['Sur','Sur','Sur','Sur','Sur']]
    
    listamultas = [(0, 0, 120),
                   (1, 2, 330),
                   (3, 4, 123),
                   (4, 2, 62),
                   (0, 0, 50),
                   (4, 4, 89),
                   (0, 3, 25),
                   (2, 0, 43),
                   (3, 2, 21),
                   (0, 0, 120)]
    
    # PROCEDIMIENTO
    recaudar = generaMatriz(listamultas,sectores)
    
    # SALIDA
    print(sectores)
    print(listamultas)
    print('Hay que recaudar:')
    print(recaudar)
    

    Resultado del algoritmo

    [['Norte', 'Norte', 'Norte', 'Norte', 'Norte'], 
    ['Oeste', 'Oeste', 'Centro', 'Este', 'Este'], 
    ['Oeste', 'Oeste', 'Centro', 'Este', 'Este'], 
    ['Oeste', 'Oeste', 'Centro', 'Este', 'Este'], 
    ['Sur', 'Sur', 'Sur', 'Sur', 'Sur']]
    [(0, 0, 120), (1, 2, 330), (3, 4, 123), 
    (4, 2, 62), (0, 0, 50), (4, 4, 89), 
    (0, 3, 25), (2, 0, 43), (3, 2, 21), (0, 0, 120)]
    Hay que recaudar:
    [[290.   0.   0.  25.   0.]
     [  0.   0. 330.   0.   0.]
     [ 43.   0.   0.   0.   0.]
     [  0.   0.  21.   0. 123.]
     [  0.   0.  62.   0.  89.]]
    >>>