Ejercicios
Raíces de un polinomio
Escriba un trozo ( chunk ) de código en el que defina los coeficientes de un polinómio de la pinta \(y = a_0 + a_1 x + a_2 x^2\) y calcule las raíces del polinomio \(x_{\pm} = \frac{-a_1 \pm \Delta}{2a_2}\), con \(\Delta = \sqrt{a_1^2-4a_2a_0}\)·
a_0 = -1
a_1 = 0
a_2 = 1
delta = ...
x_mas = (-a_1 + delta)/(2*a_2)
x_menos = ...
Raíces de un polinomio (v2)
Construya una función que reciba los coeficientes de un polinomio y retorne las posiciones de sus raíces.
calcula_raices = function(a_0,a_1,a_2){
# Acá incluyan lo que armaron en el ejercicio anterior
return(c(x_mas,x_menos))
}
Suma de números enteros
Construya una función que retorne la suma de los primeros N
números enteros
suma_enteros = function(N){
return(sum(...))
}
Escribiendo letras
Usando la función sample
pueden elegirse un elemento al azar de un vector:
sample(1:3,size=1)
Imaginemos un teclado en el que se apretan letras al azar hasta que sale una letra a. ¿Cuantas letras se escribiran en general? Para responder esto:
- Construya una función que elija una letra al azar del abecedario:
elige_letra = function(){
a = sample(...,size=1)
return(...)
}
- Construya una función que agregue letras a una palabra hasta que salga la primer letra a:
construye_palabra = function(letra_stop='a'){
letra = elige_letra()
palabra = letra
while(...){
letra = ...
palabra = paste(palabra,...,sep='')
}
return(palabra)
}
- Construya una función que se ocupe de generar N palabras y calcule la longitud promedio que tienen. La función
nchar
cuenta la cantidad de caracteres en un string. ¿Ve alguna relación entre el número de letras disponibles y la longitud de la palabra?
experimento_palabras = function(N=100,letra_stop='a'){
longitud = 0
for(i in 1:N){
palabra = ...
longitud = ... + nchar(palabra)
}
longitud = longitud/N
return(longitud)
}
- Basandose en la función anterior, construya otra función que le permita calcular el número promedio de letras d en las palabras generadas al azar.
cuantas_letra = function(palabra,letra_contar = 'b'){
palabra_split = strsplit(palabra,'')[[1]] # Esto da un vector con las letras todas separadas
conteo = sum(...==...) # Una forma de pensarlo
return(conteo)
}
experimento_letras = function(N=100,letra_stop='a',letra_contar = 'b'){
letras = 0
for(i in 1:N){
palabra = ...
letras = ... + cuantas_letra(...,...)
}
letras = letras/N
return(letras)
}
Usando un paquete
En este ejercicio vamos a usar el paquete MASS
que instalamos en el tutorial. Por si no lo hicieron:
install.packages('MASS')
library(MASS)
- Considere la siguiente matriz de \(R^{3 \times 2}\):
A = matrix(c(-1,3,2),nrow=1,byrow=TRUE)
print(A)
Calcule su núcleo (los vectores \(v\) de \(R^3\) tales que \(Av=0\)) manualmente.
Use la función Null
del paquete MASS
para calcular automáticamente una base del núcleo. ¿Es consistente con lo que calculó manualmente?
Construya una función proyeccion
que retorne para un vector vector
y una matriz A
, el vector del núcleo más similar a vector
proyectandolo al núcleo.
proyeccion = function(vector,A){
nucleo = ...
vector_proyectado = ...%*%vector
return(vector_proyectado)
}
Conteo de números primos
Construya una función que detecte si un número entero es divisible o no por un conjunto de otros números. Tip: la operación %%
aplica la operación módulo.
Construya una función que encuentre el número primo \(n+1\) a partir de una lista con los primeros \(n\) números primos.
Construya una función que encuentre los primeros \(n+1\) números primos.
Lectura de datos de nombres
datos = read.csv('nombre_del_archivo')
Encuentren los nombres más y menos comunes. Tip: la funciónes max
y min
retornan máximos y mínimos, y las funciones which.max
y which.min
identifican la (primera) posición en que estos ocurren. Comparen con usar la función which
.
Encuentren el nombre que incluya la terminación el más común y el menos común. También el nombre que empiece con a más y menos común.
LS0tCnRpdGxlOiAiRWplcmNpY2lvcyBkZSBwcmVjYWxlbnRhbWllbnRvIgphdXRob3I6ICJBcmllbCBTYWxnYWRvIgpkYXRlOiAiMjAgZGUgSnVsaW8gZGUgMjAyMSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBsdW1lbgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCnN1YnRpdGxlOiAiTGFib3JhdG9yaW8gZGUgRGF0b3MiCi0tLQoKIyBFbiBlc3RlIG5vdGVib29rCgpFc3RlIG5vdGVib29rIGNvbnNpc3RlIGRlIGFsZ3Vub3MgZWplcmNpY2lvcyBzZW5jaWxsb3MgZGUgcGFyYSBmYW1pbGlhcml6YXJzZSBjb24gbGFzIGhlcnJhbWllbnRhcyBiw6FzaWNhcyBkZSBgUmAuCgojIEVqZXJjaWNpb3MKCiMjIyMgUmHDrWNlcyBkZSB1biBwb2xpbm9taW8KCkVzY3JpYmEgdW4gdHJvem8gKCBfY2h1bmtfICkgZGUgY8OzZGlnbyBlbiBlbCBxdWUgZGVmaW5hIGxvcyBjb2VmaWNpZW50ZXMgZGUgdW4gcG9saW7Ds21pbyBkZSBsYSBwaW50YSAkeSA9IGFfMCArIGFfMSB4ICsgYV8yIHheMiQgeSBjYWxjdWxlIGxhcyByYcOtY2VzIGRlbCBwb2xpbm9taW8gJHhfe1xwbX0gPSBcZnJhY3stYV8xIFxwbSBcRGVsdGF9ezJhXzJ9JCwgY29uICRcRGVsdGEgPSBcc3FydHthXzFeMi00YV8yYV8wfSTCtwoKYGBgCmFfMCA9IC0xCmFfMSA9IDAKYV8yID0gMQoKZGVsdGEgPSAuLi4KCnhfbWFzID0gKC1hXzEgKyBkZWx0YSkvKDIqYV8yKQp4X21lbm9zID0gLi4uCmBgYAoKIyMjIyBSYcOtY2VzIGRlIHVuIHBvbGlub21pbyAodjIpCgpDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSByZWNpYmEgbG9zIGNvZWZpY2llbnRlcyBkZSB1biBwb2xpbm9taW8geSByZXRvcm5lIGxhcyBwb3NpY2lvbmVzIGRlIHN1cyByYcOtY2VzLgoKYGBgCmNhbGN1bGFfcmFpY2VzID0gZnVuY3Rpb24oYV8wLGFfMSxhXzIpewogICMgQWPDoSBpbmNsdXlhbiBsbyBxdWUgYXJtYXJvbiBlbiBlbCBlamVyY2ljaW8gYW50ZXJpb3IKICByZXR1cm4oYyh4X21hcyx4X21lbm9zKSkKfQpgYGAKCiMjIyMgU3VtYSBkZSBuw7ptZXJvcyBlbnRlcm9zCgpDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSByZXRvcm5lIGxhIHN1bWEgZGUgbG9zIHByaW1lcm9zIGBOYCBuw7ptZXJvcyBlbnRlcm9zCgpgYGAKc3VtYV9lbnRlcm9zID0gZnVuY3Rpb24oTil7CiAgcmV0dXJuKHN1bSguLi4pKQp9CmBgYAoKIyMjIyBFc2NyaWJpZW5kbyBsZXRyYXMKClVzYW5kbyBsYSBmdW5jacOzbiBgc2FtcGxlYCBwdWVkZW4gZWxlZ2lyc2UgdW4gZWxlbWVudG8gYWwgYXphciBkZSB1biB2ZWN0b3I6CgpgYGB7cn0Kc2FtcGxlKDE6MyxzaXplPTEpCmBgYAoKSW1hZ2luZW1vcyB1biB0ZWNsYWRvIGVuIGVsIHF1ZSBzZSBhcHJldGFuIGxldHJhcyBhbCBhemFyIGhhc3RhIHF1ZSBzYWxlIHVuYSBsZXRyYSBfYV8uIMK/Q3VhbnRhcyBsZXRyYXMgc2UgZXNjcmliaXJhbiBlbiBnZW5lcmFsPyBQYXJhIHJlc3BvbmRlciBlc3RvOgoKKiBDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSBlbGlqYSB1bmEgbGV0cmEgYWwgYXphciBkZWwgYWJlY2VkYXJpbzoKCmBgYAplbGlnZV9sZXRyYSA9IGZ1bmN0aW9uKCl7CiAgYSA9IHNhbXBsZSguLi4sc2l6ZT0xKQogIHJldHVybiguLi4pCn0KYGBgCiogQ29uc3RydXlhIHVuYSBmdW5jacOzbiBxdWUgYWdyZWd1ZSBsZXRyYXMgYSB1bmEgcGFsYWJyYSBoYXN0YSBxdWUgc2FsZ2EgbGEgcHJpbWVyIGxldHJhIF9hXzoKCmBgYApjb25zdHJ1eWVfcGFsYWJyYSA9IGZ1bmN0aW9uKGxldHJhX3N0b3A9J2EnKXsKICBsZXRyYSA9IGVsaWdlX2xldHJhKCkKICBwYWxhYnJhID0gbGV0cmEKICB3aGlsZSguLi4pewogICAgbGV0cmEgPSAuLi4KICAgIHBhbGFicmEgPSBwYXN0ZShwYWxhYnJhLC4uLixzZXA9JycpCiAgfQogIHJldHVybihwYWxhYnJhKQp9CmBgYAoKKiBDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSBzZSBvY3VwZSBkZSBnZW5lcmFyIF9OXyBwYWxhYnJhcyB5IGNhbGN1bGUgbGEgbG9uZ2l0dWQgcHJvbWVkaW8gcXVlIHRpZW5lbi4gX0xhIGZ1bmNpw7NuIGBuY2hhcmAgY3VlbnRhIGxhIGNhbnRpZGFkIGRlIGNhcmFjdGVyZXMgZW4gdW4gc3RyaW5nLl8gwr9WZSBhbGd1bmEgcmVsYWNpw7NuIGVudHJlIGVsIG7Dum1lcm8gZGUgbGV0cmFzIGRpc3BvbmlibGVzIHkgbGEgbG9uZ2l0dWQgZGUgbGEgcGFsYWJyYT8KCmBgYApleHBlcmltZW50b19wYWxhYnJhcyA9IGZ1bmN0aW9uKE49MTAwLGxldHJhX3N0b3A9J2EnKXsKICBsb25naXR1ZCA9IDAKICBmb3IoaSBpbiAxOk4pewogICAgcGFsYWJyYSA9IC4uLgogICAgbG9uZ2l0dWQgPSAuLi4gKyBuY2hhcihwYWxhYnJhKQogIH0KICBsb25naXR1ZCA9IGxvbmdpdHVkL04KICByZXR1cm4obG9uZ2l0dWQpCn0KYGBgCgoqIEJhc2FuZG9zZSBlbiBsYSBmdW5jacOzbiBhbnRlcmlvciwgY29uc3RydXlhIG90cmEgZnVuY2nDs24gcXVlIGxlIHBlcm1pdGEgY2FsY3VsYXIgZWwgbsO6bWVybyBwcm9tZWRpbyBkZSBsZXRyYXMgX2RfIGVuIGxhcyBwYWxhYnJhcyBnZW5lcmFkYXMgYWwgYXphci4KCmBgYApjdWFudGFzX2xldHJhID0gZnVuY3Rpb24ocGFsYWJyYSxsZXRyYV9jb250YXIgPSAnYicpewogIHBhbGFicmFfc3BsaXQgPSBzdHJzcGxpdChwYWxhYnJhLCcnKVtbMV1dICMgRXN0byBkYSB1biB2ZWN0b3IgY29uIGxhcyBsZXRyYXMgdG9kYXMgc2VwYXJhZGFzCiAgY29udGVvID0gc3VtKC4uLj09Li4uKSAjIFVuYSBmb3JtYSBkZSBwZW5zYXJsbwogIHJldHVybihjb250ZW8pCn0KCmV4cGVyaW1lbnRvX2xldHJhcyA9IGZ1bmN0aW9uKE49MTAwLGxldHJhX3N0b3A9J2EnLGxldHJhX2NvbnRhciA9ICdiJyl7CiAgbGV0cmFzID0gMAogIGZvcihpIGluIDE6Til7CiAgICBwYWxhYnJhID0gLi4uCiAgICBsZXRyYXMgPSAuLi4gKyBjdWFudGFzX2xldHJhKC4uLiwuLi4pCiAgfQogIGxldHJhcyA9IGxldHJhcy9OCiAgcmV0dXJuKGxldHJhcykKfQpgYGAKCiMjIyMgVXNhbmRvIHVuIHBhcXVldGUKCkVuIGVzdGUgZWplcmNpY2lvIHZhbW9zIGEgdXNhciBlbCBwYXF1ZXRlIGBNQVNTYCBxdWUgaW5zdGFsYW1vcyBlbiBlbCB0dXRvcmlhbC4gUG9yIHNpIG5vIGxvIGhpY2llcm9uOgoKYGBgCmluc3RhbGwucGFja2FnZXMoJ01BU1MnKQpsaWJyYXJ5KE1BU1MpCmBgYAoKKiBDb25zaWRlcmUgbGEgc2lndWllbnRlIG1hdHJpeiBkZSAkUl57MyBcdGltZXMgMn0kOgoKYGBge3J9CkEgPSBtYXRyaXgoYygtMSwzLDIpLG5yb3c9MSxieXJvdz1UUlVFKQpwcmludChBKQpgYGAKQ2FsY3VsZSBzdSBuw7pjbGVvIChsb3MgdmVjdG9yZXMgJHYkIGRlICRSXjMkIHRhbGVzIHF1ZSAkQXY9MCQpIG1hbnVhbG1lbnRlLgoKKiBVc2UgbGEgZnVuY2nDs24gYE51bGxgIGRlbCBwYXF1ZXRlIGBNQVNTYCBwYXJhIGNhbGN1bGFyIGF1dG9tw6F0aWNhbWVudGUgdW5hIGJhc2UgZGVsIG7DumNsZW8uIMK/RXMgY29uc2lzdGVudGUgY29uIGxvIHF1ZSBjYWxjdWzDsyBtYW51YWxtZW50ZT8KCiogQ29uc3RydXlhIHVuYSBmdW5jacOzbiBgcHJveWVjY2lvbmAgcXVlIHJldG9ybmUgcGFyYSB1biB2ZWN0b3IgYHZlY3RvcmAgeSB1bmEgbWF0cml6IGBBYCwgZWwgdmVjdG9yIGRlbCBuw7pjbGVvIG3DoXMgc2ltaWxhciBhIGB2ZWN0b3JgIHByb3llY3RhbmRvbG8gYWwgbsO6Y2xlby4KCmBgYApwcm95ZWNjaW9uID0gZnVuY3Rpb24odmVjdG9yLEEpewogIG51Y2xlbyA9IC4uLgogIHZlY3Rvcl9wcm95ZWN0YWRvID0gLi4uJSoldmVjdG9yCiAgcmV0dXJuKHZlY3Rvcl9wcm95ZWN0YWRvKQp9CgpgYGAKCiMjIyMgQ29udGVvIGRlIG7Dum1lcm9zIHByaW1vcwoKKiBDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSBkZXRlY3RlIHNpIHVuIG7Dum1lcm8gZW50ZXJvIGVzIGRpdmlzaWJsZSBvIG5vIHBvciB1biBjb25qdW50byBkZSBvdHJvcyBuw7ptZXJvcy4gX1RpcDogbGEgb3BlcmFjacOzbl8gYCUlYCBfYXBsaWNhIGxhIG9wZXJhY2nDs24gbcOzZHVsb18uCgoqIENvbnN0cnV5YSB1bmEgZnVuY2nDs24gcXVlIGVuY3VlbnRyZSBlbCBuw7ptZXJvIHByaW1vICRuKzEkIGEgcGFydGlyIGRlIHVuYSBsaXN0YSBjb24gbG9zIHByaW1lcm9zICRuJCBuw7ptZXJvcyBwcmltb3MuCgoqIENvbnN0cnV5YSB1bmEgZnVuY2nDs24gcXVlIGVuY3VlbnRyZSBsb3MgcHJpbWVyb3MgJG4rMSQgbsO6bWVyb3MgcHJpbW9zLgoKIyMjIyBMZWN0dXJhIGRlIGRhdG9zIGRlIG5vbWJyZXMKCiogRW50cmVuIGVuIGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvb3Ryb3Mtbm9tYnJlcy1wZXJzb25hcy1maXNpY2FzIHkgZGVzY2FyZ3VlbiB1biBkYXRhc2V0IGRlIG5vbWJyZXMgcGFyYSB1biBhw7FvIGRlIHN1IGVsZWNjacOzbi4KCiogVXNlbiBsYSBmdW5jacOzbiBgcmVhZC5jc3ZgIHBhcmEgbGVlciBlbCBhcmNoaXZvIGVuIGZvcm1hdG8gYGRhdGEuZnJhbWVgLiBFeHBsb3JlbiBlbCBjb250ZW5pZG8gZGVsIG1pc21vLiDCv1F1w6kgaW5mb3JtYWNpw7NuIGhheSBlbiBsYXMgY29sdW1uYXM/CgpgYGAKZGF0b3MgPSByZWFkLmNzdignbm9tYnJlX2RlbF9hcmNoaXZvJykKYGBgCgoKKiBFbmN1ZW50cmVuIGxvcyBub21icmVzIG3DoXMgeSBtZW5vcyBjb211bmVzLiBfVGlwOl8gbGEgZnVuY2nDs25lcyBgbWF4YCB5IGBtaW5gIHJldG9ybmFuIG3DoXhpbW9zIHkgbcOtbmltb3MsIHkgbGFzIGZ1bmNpb25lcyBgd2hpY2gubWF4YCB5IGB3aGljaC5taW5gIGlkZW50aWZpY2FuIGxhIChwcmltZXJhKSBwb3NpY2nDs24gZW4gcXVlIGVzdG9zIG9jdXJyZW4uIENvbXBhcmVuIGNvbiB1c2FyIGxhIGZ1bmNpw7NuIGB3aGljaGAuCgoqIEVuY3VlbnRyZW4gZWwgbm9tYnJlIHF1ZSBpbmNsdXlhIGxhIHRlcm1pbmFjacOzbiBfZWxfIG3DoXMgY29tw7puIHkgZWwgbWVub3MgY29tw7puLiBUYW1iacOpbiBlbCBub21icmUgcXVlIGVtcGllY2UgY29uIF9hXyBtw6FzIHkgbWVub3MgY29tw7puLgoK