2Eva_IIT2016_T3 Prueba de Escritorio – conjuntos, operaciones, diferencia simétrica

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

Tema 3. (10 puntos) Dados los conjuntos:

A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8, 9}
C = {5, 4, 7, 0, 1}
Y = {len(A), len(B), len (C)}

a. Indique la salida del programa. Justifique su respuesta

X = A|B
Z = X^C
E = X-C
print(A.issubset(E))

b. Indique la salida del programa. Justifique su respuesta

Y = A&Y
Z = Y-C
print(Z)

Referencia: Archivo original 2Eva_IIT2016.pdf

2Eva_IIT2016_T2 País destino para jubilados extranjeros

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

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

Tema 2. Para ayudar a las personas alrededor del mundo a seleccionar un país donde vivir cuando se jubilen, se ofrece información como el  costo de vida, las temperaturas medias por ciudad, etc.jubiladocuenca01

a. Escriba la función cargarDatos(nomFile)
que recibe el nombre de un archivo con las ciudades y sus métricas y retorna un diccionario con la estructura mostrada a continuación:

Ejemplo: "datos.txt" contiene:

Cuenca,temperatura,22
Guayaquil,canastaBasica,630
Cuenca,canastaBasica,457
Bogota,canastaBasica,321
Bogota,temperatura,20
Guayaquil,temperatura,29

cargarDatos("datos.txt") retorna un diccionario con la siguiente estructura:
datos=
{"Guayaquil":{"canastaBasica":630, "temperatura":29},
 "Cuenta":   {"canastaBasica":457, "temperatura":22},
  ...}

Nota: para el ejercicio solo existen dos métricas posibles: “canastaBásica” y “temperatura” y todas las ciudades tienen ambas métricas.

b. Escriba la función metricaPais(datos, paises) que recibe el diccionario datos, generado con la función anterior, y el diccionario paises que tiene como clave el nombre del país y como valor la lista de ciudades para ese país. Esta función calcula el valor promedio de cada métrica por país y retorna un diccionario cuya clave es el país y cuyo valor es otro diccionario con los promedios por métrica.

paises={'Ecuador':{'Cuenca','Guayaquil'},'Colombia':{'Bogotá'}, ...}

Por ejemplo, para Guayaquil y Cuenca que pertenecen al mismo país se calcula el promedio de las métricas: "canastaBasica" y "temperatura", cuyo resultado se lo asigna al país Ecuador

{"Ecuador":  {"canastaBasica":542.50, "temperatura":25.5},
 "Colombia": {"canastaBasica":321, "temperatura":20},
 ...}

c. Escriba la función generaPaises(promedios, metrica, minimo, maximo)  para buscar los paises que en su promedios cumplen con los valores entre mínimo y máximo para una métrica deseada.

Los argumentos son promedios, con la estructura del diccionario generado en la función anterior, una cadena denominado métrica que puede ser “canastaBasica” o “temperatura” y un valor mínimo y un máximo para dicha métrica. El resultado será un archivo con el nombre de la métrica”.csv” que contiene: los países y el valor de la métrica buscada separados por coma.

Usando el ejemplo anterior:
generaPaises(proms, "temperatura", 23, 26) 

"temperatura.csv" tendrá el siguiente contenido:
Ecuador,temperatura, 25.5

Referencia: “Ecuador, a la cabeza de los mejores países para los jubilados“. 2 de Enero, 2015, www.eluniverso.com,

Archivo original 2Eva_IIT2016.pdf

2Eva_IIT2016_T1 Multas de Transito por sector

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

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

Tema 1. (30 puntos) Para registrar las multas de tránsito, la ciudad será representada por una matriz de 5×5 dividida en cuadrantes y sectores. multastransito01

Cada celda corresponde a un cuadrante y registra los valores acumulados de las multas reportadas por los agentes de tránsito. Existen cinco “sectores” (Norte Sur, Centro, Este y Oeste) que agrupan a varios cuadrantes mostrados en la tabla “sectores”.

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

La tabla sectores muestra únicamente la distribución de sectores. No debe crear esta matriz “sectores”.

Para cumplir con la tarea, deberá implementar lo siguiente:

a. Una función generaMatriz(listamultas) que recibe una lista de tuplas  con las coordenadas del cuadrante y el valor de la multa (fila, columna, valor). La función deberá retornar una matriz (arreglo Numpy) con el valor agregado de las multas generadas para cada cuadrante.

Por ejemplo, para:
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)]

la función retorna:
totalmultas
 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

Nota: las coordenadas de la totalmultas empiezan en 0,0. En listamultas, las coordenadas pueden repetirse al haber varias multas en un mismo cuadrante.

b. Una función sectorTop(matriz) que reciba la matriz generada en el tema anterior, calcule el sector con el vator total de multas más alto y retorne una tupla con el nombre del sector (Norte, Sur, Centro, Este, Oeste) y dicho valor.

Para el ejemplo anterior, la función retornará: 
('Centro',351)

Referencia: “Doble columna y uso de zonas prohibidas, problemas por resolver en Guayaquil“, 27 de Agosto, 2015, www.eluniverso.com

Archivo original 2Eva_IIT2016.pdf

s2Eva_IIT2016_T2 País destino para jubilados extranjeros

Ejercicio: 2Eva_IIT2016_T2 País destino para jubilados extranjeros

Propuesta de solución en Python:

requiere usar el archivo: destinosdatos.txt

# CCPG1001-Fundamentos de programación FIEC-ESPOL
# 2Eva_IIT2016_T2 País destino para jubilados extranjeros

def cargarDatos(nomFile):
    datos = {}
    archivo = open(nomFile, 'r')
    linea = archivo.readline()
    while not(linea==''):
        linea = linea.strip('\n')
        partes = linea.split(',')
        
        ciu = partes[0]
        met = partes[1]
        val = float(partes[2])
        
        if not(ciu in datos):
            datos[ciu] = {met:val}
        else:
            datos[ciu][met]= val
        linea = archivo.readline()
        
    archivo.close()
    return(datos)

def metricaPais(datos, paises):
    promedios = {}
    for unpais in paises:
        totalcanasta = 0
        totaltemperatura = 0
        ciudades = paises[unpais]
        
        for unaciudad in ciudades:
            unacanasta = datos[unaciudad]['canastaBasica']
            totalcanasta = totalcanasta + unacanasta
            unatemp = datos[unaciudad]['temperatura']
            totaltemperatura = totaltemperatura + unatemp

        # los promedios son por pais
        promediocanasta     = totalcanasta/len(ciudades)
        promediotemperatura = totaltemperatura/len(ciudades)
        promedios[unpais] = {'canastaBasica': promediocanasta,
                             'temperatura': promediotemperatura}  
    return(promedios)

def generaPaises(promedios, metrica, minimo, maximo):
    narchivo = 'cumplencon.csv'
    archivo  = open(narchivo, 'w')
    
    for unpais in promedios:
        valor = promedios[unpais][metrica]
        if (valor>=minimo and valor<=maximo):
            linea = unpais +'\n'
            archivo.write(linea)
    archivo.close
    
    mensaje = 'resultados en archivo'
    return(mensaje)


# PROGRAMA Prueba
# INGRESO
paises = {'Ecuador':{'Cuenca','Guayaquil'},
          'Colombia':{'Bogotá'}}

nomFile = 'destinosdatos.txt'

metrica = input('cual metrica: ')
minimo  = float(input('minimo: '))
maximo  = float(input('maximo: '))

# PROCEDIMIENTO
tabla = cargarDatos(nomFile)
promedios = metricaPais(tabla, paises)
cualescumplen = generaPaises(promedios, metrica, minimo, maximo)

# SALIDA
print('tabla de datos: ')
print(tabla)
print('paises')
print(paises)
print('promedios de características')
print(promedios)
print('paises de interes para el jubilado, en archivo')

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