From 4b75867b778a688ecf50324ed88ac3efa8f832ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eugenio=20C=C3=A1lcena?= Date: Fri, 9 Nov 2018 16:55:26 -0300 Subject: [PATCH] =?UTF-8?q?Agrego=20carpeta=20con=20ejercicios=20de=20la?= =?UTF-8?q?=20pr=C3=A1ctica=20resueltos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ejercicios Resueltos/Ejercicio_1.py | 46 ++++++++++++++ Ejercicios Resueltos/Ejercicio_2.py | 30 +++++++++ Ejercicios Resueltos/Ejercicio_3.py | 62 +++++++++++++++++++ Ejercicios Resueltos/Ejercicio_4_5_6.py | 51 +++++++++++++++ Ejercicios Resueltos/Ejercicio_7_8_9.py | 72 ++++++++++++++++++++++ Ejercicios Resueltos/Input_Ejercicio_4.txt | 11 ++++ 6 files changed, 272 insertions(+) create mode 100644 Ejercicios Resueltos/Ejercicio_1.py create mode 100644 Ejercicios Resueltos/Ejercicio_2.py create mode 100644 Ejercicios Resueltos/Ejercicio_3.py create mode 100644 Ejercicios Resueltos/Ejercicio_4_5_6.py create mode 100644 Ejercicios Resueltos/Ejercicio_7_8_9.py create mode 100644 Ejercicios Resueltos/Input_Ejercicio_4.txt diff --git a/Ejercicios Resueltos/Ejercicio_1.py b/Ejercicios Resueltos/Ejercicio_1.py new file mode 100644 index 0000000..3df7431 --- /dev/null +++ b/Ejercicios Resueltos/Ejercicio_1.py @@ -0,0 +1,46 @@ +## EJERCICIO 1 +#============== +#ENUNCIADO +#Si hacemos una lista de todos los números naturales debajo de 10 que sean múltiplos de 3 o 5 obtendríamos 3, 5, 6 y 9. +#La suma de los múltiplos es 23. Encuentre la suma de todos los múltiplos de 3 y 5 debajo de 1000. +#SOLUCION +# Suma todos los numeros enteros dentro del rango [min] y [max] que sean multiplos de los numeros enteros dentro de [listaBase]. +# El ultimo argumento [asociation] indica si se desea la suma de los multiplos de cualquier numero de [listaBase] (OR) o solo de todos a la vez (AND) +def sumMultiplos(listBase, min=0, max=1000, asociation="OR"): + integerList = list(range(min,max)) + if asociation is "OR": + sum = _sumMultiplosOR(listBase, integerList) + elif asociation is "AND": + sum = _sumMultiplosAND(listBase, integerList) + return sum + +def _sumMultiplosOR(listBase, integerList): + suma = 0 + for integer in integerList: + if _isMultiplo(integer, listBase): + suma += integer + return suma + +def _isMultiplo(integer, listBase): + isMultiplo = False + for multiplo in listBase: + if integer % multiplo is 0: + isMultiplo = True + break + return isMultiplo + +def _sumMultiplosAND(listBase, integerList): + suma = 0 + for integer in integerList: + if integer % (_reduceMultiplication(listBase)) is 0: + suma += integer + return suma + +def _reduceMultiplication(list): + result = 1 + for integer in list: + result *= integer + return result + +print(sumMultiplos([3,5],0,1000,"OR")) +print(sumMultiplos([3,5],0,1000,"AND")) \ No newline at end of file diff --git a/Ejercicios Resueltos/Ejercicio_2.py b/Ejercicios Resueltos/Ejercicio_2.py new file mode 100644 index 0000000..ced8066 --- /dev/null +++ b/Ejercicios Resueltos/Ejercicio_2.py @@ -0,0 +1,30 @@ +## EJERCICIO 1 +#============== +#ENUNCIADO +#Cada término en la serie de Fibonacci es generado a partir de la suma de los dos términos previos, empezando de 1 y 2, +#los diez primeros términos serán: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … +#Considerando los términos de la serie de Fibonacci que son impares, y por debajo de un millón encuentre la suma de dichos términos. + +def sumFibonacciOdsTermsTo(limit): + odsSum = 0 + for i in fibonacciListTo(limit): + if i % 2 is not 0: + odsSum += i + return odsSum + +def fibonacciListTo(limit): + fibonacciList = [0,1] + while fibonacciList[-1] < limit: + fibonacciList.append(fibonacciList[-1] + fibonacciList[-2]) + fibonacciList.remove(1) + return fibonacciList[:-1] + +def fibonacci(value): + a, b = 0,1 + while a < value: + a, b = b, a+b + return a + +print(sumFibonacciOdsTermsTo(1000000)) +print(fibonacciListTo(1000000)) + diff --git a/Ejercicios Resueltos/Ejercicio_3.py b/Ejercicios Resueltos/Ejercicio_3.py new file mode 100644 index 0000000..fe4f7d5 --- /dev/null +++ b/Ejercicios Resueltos/Ejercicio_3.py @@ -0,0 +1,62 @@ +## EJERCICIO 1 +#============== +#ENUNCIADO +#Los factores primos en 13195 son 5, 7, 13 y 29 ¿ Cuál es el factor primo más grande en el número 600851475143 ? + +def maxPrimeFactor(integer, granul): + primeDivisorList = [] + step = integer // granul + progress = 0 + checkpoint = 3 + tempProgress = 1 + for i in range(3, integer): + if i == checkpoint: + if tempProgress != round(progress*100/granul, 2): + print("Calculating: " + str("%.2f" % (progress*100/granul)) + "%") + tempProgress = round(progress*100/granul, 2) + progress += 1 + checkpoint += step + if isDivisor(i,integer) and isPrime(i): + primeDivisorList.append(i) + if mul(primeDivisorList) >= integer: + break + return primeDivisorList + +def is_Prime(integer): + isPrime = True + print("Checking if " + str(integer) + " is prime") + for i in range(integer-1, 1, -1): + if isDivisor(i, integer): + isPrime = False + break + return isPrime + +def mul(listIntegers): + result = 1 + for i in listIntegers: + result *= i + return result + +def isDivisor(i, integer): + return integer % i is 0 + +def isPrime(n): + isPrime = False + print("Checking if " + str(n) + " is prime") + if n <= 1: + pass + elif n <= 3: + isPrime = True + elif n % 2 == 0 or n % 3 == 0: + pass + else: + i = 5 + while i * i <= n: + if n % i == 0 or n % (i + 2) == 0: + pass + i = i + 6 + isPrime = True + print(isPrime) + return isPrime + +print(maxPrimeFactor(600851475143, 10000)) \ No newline at end of file diff --git a/Ejercicios Resueltos/Ejercicio_4_5_6.py b/Ejercicios Resueltos/Ejercicio_4_5_6.py new file mode 100644 index 0000000..96f492b --- /dev/null +++ b/Ejercicios Resueltos/Ejercicio_4_5_6.py @@ -0,0 +1,51 @@ +## EJERCICIO 4, 5 y 6 +#============== +#ENUNCIADO +#Dado el siguiente set de datos, obtenga un gráfico tipo scatter plot para X en función de Y +#Intente realizar un ajuste lineal o de algún polinomio utilizando este set de datos. +#Intente colocar label para los ejes y los datos + +import matplotlib.pyplot as pp +import numpy as np +from scipy.optimize import curve_fit + +# Funcion principal, toma los datos de un archivo de texto plano de dos columnas tabuladas, +# omite la primer linea (rotulos). El delimitador decimal puede ser coma o punto. +def scatterPlotXY(inputFile): + input = open(inputFile, 'r') #abre el archivo con los datos + data = [] + #lee el archivo y agrega los valores a una lista, cada valor es una linea del archivo con dos valores + #asociados. Si los delimitadores decimales son coma, los pasa a punto. + for line in input: + value = line.replace('\n','') + value = value.replace(',','.') + data.append(value) + + #crea un array numpy con los datos de la lista y lo usa para preparar los datos para su ploteo + npArray = np.array(data) + plotData = np.loadtxt(npArray, delimiter='\t', skiprows=1) #utiliza como delimitador la tabulacion y saltea la primer linea (rotulos) + plotData = np.transpose(plotData) #transpone los datos para referirse a columna de X y columna de Y + x = plotData[0] #columna x + y = plotData[1] #columna y + + #utiliza la libreria optimize para hacer una ajuste (lineal) y guardar parametros de este + fitParams, fitCovariances = curve_fit(linearFitXY,x,y) + sigma = [fitCovariances[0,0], fitCovariances[1,1]] + + #se crea y configura la figura para graficar los datos + pp.figure(figsize=(12, 6)) + pp.ylabel('Position (cm)', fontsize = 16) + pp.xlabel('Time (s)', fontsize = 16) + pp.errorbar(x, y, fmt = 'ro', yerr = sigma[1]) + #pp.scatter(plotData[0],plotData[1]) + pp.plot(x, linearFitXY(x, fitParams[0], fitParams[1])) + pp.plot(x, linearFitXY(x, fitParams[0] + sigma[0], fitParams[1] + sigma[1])) + pp.plot(x, linearFitXY(x, fitParams[0] - sigma[0], fitParams[1] - sigma[1])) + #pp.savefig('dataFitted.png', bbox_inches=0, dpi=300) + pp.show() + +#funcion lineal de modelo para el ajuste +def linearFitXY(x, m, b): + return m * x + b + +scatterPlotXY('Input_Ejercicio_4.txt') \ No newline at end of file diff --git a/Ejercicios Resueltos/Ejercicio_7_8_9.py b/Ejercicios Resueltos/Ejercicio_7_8_9.py new file mode 100644 index 0000000..ae9b6a7 --- /dev/null +++ b/Ejercicios Resueltos/Ejercicio_7_8_9.py @@ -0,0 +1,72 @@ +## EJERCICIO 7,8 y 9 +#============== +#ENUNCIADO +#Graficar el siguiente polinomio, su derivada y puntos extremos: f(x)=x³+x²-4x+4 +#Colocar titulo a los ejes y agregarle una grilla en ambos. Definir el rango de la función entre -10 y 10. +#Colocar titulo y colores distintos para la función y la derivada. +#Guardar los resultados de evaluar la función en el rango del punto a cada 0.1 unidades en un archivo de texto. + +import matplotlib.pyplot as pp +import numpy as np +from scipy.optimize import curve_fit + +def polinomePlot(coeficients, rangeMin, rangeMax): + + if coeficients == []: + print("LA LISTA DE COEFICIENTES ESTA VACIA!!") + return + + #se eliminan coeficientes nulos iniciales si los hay + while coeficients[0] is 0: + coeficients.remove(0) + + #crea un muestreo de 50 numeros en el rango dado + x = np.arange(rangeMin, rangeMax, 0.1) + #se crea un polinomio con los coeficientes + pol = np.poly1d(coeficients) + #se crea una funcion anonima de evaluación del polinomio para x + y = pol(x) + #se calcula la derivada del polinomio + polDer = np.polyder(pol) + #se crea una funcion anonima de evaluación de la derivada del polinomio para x + y2 = polDer(x) + + #calcula raices del polinomio (array de salida) e imprime en pantalla + roots = np.roots(pol) + for root in roots: + print("ROOT: " + str(root)) + + #calcula raices del polinomio derivado (array de salida) e imprime en pantalla + rootsDer = np.roots(polDer) + for root in rootsDer: + print("DER_ROOT: " + str(root)) + + #crea y guarda los datos del polinomio evaluado en el rango dado en un archivo de texto txt + array = np.transpose([x,y]) + file = open('polinome.txt', 'w') + np.savetxt('polinome.txt', array, fmt='%.1f', delimiter='\t', header="x\tf(x)") + file.close() + + #se crea y configura la figura para graficar los datos + pp.figure(figsize=(12, 6)) + pp.ylabel('f(x)', fontsize = 16) + pp.xlabel('x', fontsize = 16) + pp.scatter(x,y,c='R', label = 'f(x) = ' + str(str(pol).splitlines()[1])) + pp.scatter(x,y2,c='B', label= 'f\'(x) = ' + str(str(polDer).splitlines()[1])) + pp.legend(loc='upper left') + pp.show() + +#el primer parámetro es la lista con los coeficientes del polinomio +#los últimos 2 son el rango de calculo (min y max) +print("Igrese los coeficientes del polinomio de a uno, presione [ENTER] luego de cada uno. Cuando termine, presione [ENTER]") +rawCoeff = input() +coeffList = [] +while rawCoeff is not '': + coeffList.append(float(rawCoeff)) + rawCoeff = input() +print("La lista de coeficientes es: " + str(coeffList)) +print("Igrese el rango mínimo de ploteo como entero. Ej. -4") +minRange = int(input()) +print("Igrese el rango máximo de ploteo como entero. Ej. -4") +maxRange = int(input()) +polinomePlot(coeffList, minRange, maxRange) \ No newline at end of file diff --git a/Ejercicios Resueltos/Input_Ejercicio_4.txt b/Ejercicios Resueltos/Input_Ejercicio_4.txt new file mode 100644 index 0000000..15cb5d3 --- /dev/null +++ b/Ejercicios Resueltos/Input_Ejercicio_4.txt @@ -0,0 +1,11 @@ +X Y +7,5 28,66 +4,48 20,37 +8,60 22,33 +7,73 26,35 +5,28 22,29 +4,25 21,74 +6,99 23,11 +6,31 23,13 +9,15 24,68 +5,06 21,89 \ No newline at end of file