Ejercicio: 3Eva2018TI_T2 Producción minera del país
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.
literal a
Revisar el texto de prueba para el ejemplo:
discurso = '... y el dia de ayer descubrimos en la mina mirador que la cantidad de mral_oro ...'
A partir del texto del discurso, se obtienen las palabras que se consideran separadas por un espacio (' ').
palabras = discurso.split(' ')
En cada palabra se revisa si contiene 'mral_', Cuando se la encuentra, se extrae los minerales mencionados de esta palabra a partir del caracter en la posición 5 y se lo añade a la lista de cuales.
if 'mral_' in unapalabra:
mencionados = unapalabra[5:]
mencionados = mencionados.title()
cuales.append(mencionados)
Se realiza la búsqueda en todas las palabras y se convierte a una función según se requiere en el ejercicio.
import numpy as np
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
Considere usar como datos de prueba:
minerales = ['Oro', 'Plata', 'Cobre']
precios = [38.48, 3.43, 0.01]
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]]
Para usar funciones de Numpy, se convierte en arreglos los vectores del bloque de ingreso
produccion = np.array(P)
costosExtraccion = np.array(C, dtype=float)
costosTransporte = np.array(T)
con lo que se puede aplicar las operaciones por vectores sin tener que usar bucles para recorrer cada casilla.
ventas = produccion*precios
costo = costosTransporte + costosExtraccion
ganancia = ventas - costo
El algoritmo se agrupa dentro de la función requerida en el ejercicio.
# 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
Para este caso se requiere el resultado de la función anterior:
ganancias = calcularGanancias(P,C,T,precios)
que permite encontrar el total con la suma de todos los valores del arreglo.
Ordenar en forma ascendente y descendente se puede realizar con la función np.argsort().
ganametal = np.sum(ganancia,axis =1)
ascendente = np.argsort(ganametal)
descendente = np.argsort(-ganametal)
El resto del desarrollo se adjunta como parte del algoritmo integrado en la siguiente sección.
Algoritmo en Python
# 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']
>>>