Bienvenidos a un lugar donde la programación, los vídeos, las divagaciones y las subnormalidad se combinan para demostrar que el caos puede ser bello.
Serabe Reloaded
Conecto ergo sum. Non conecto ergo urgueo.
"Aquellos que pueden hacerlo, lo hacen. Aquellos que no pueden, se quejan."
Linus Torvalds
Tweets del 01-04-2008
- Free Graph Paper Creator http://www.printfreegraphpaper.com/ #
- Regex Mate http://regexmate.com/ #
- Songs Backwards Online http://www.talkbackwards.com/ #
Tweets del 29-03-2008
- Shell-Fu http://www.shell-fu.org/ #
- Cents of Perspective http://tinyurl.com/3xdara #
Tweets del 25-03-2008
- Regular Expressions Cheat Sheet / Chuleta de expresiones regulares http://tinyurl.com/y5tw58 #
Problema 2
Enunciado:
Suma todos los números pares de la sucesión de Fibonacci menores que un cuatro millón.
Primera solución:
La primera solución es muy simple. Hay un método que devuelve un array con todos los números de la sucesión de Fibonacci menores que un máximo max tomando como inicio un array de dos elementos arr.
-
def fib1(max,arr=[1,1])
-
while(arr.last <max) do
-
arr <<(arr.last+arr[arr.size-2])
-
end
-
arr.pop
-
arr
-
end
Después simplemente se eliminan los impares y se suman los que quedan.
-
def euler2a(max, ini=[1,1])
-
fib1(max,ini).delete_if{|x| x%2 == 1}.inject{|memo,obj| memo+obj}
-
end
-
-
puts euler2a(4e6)
Segunda solución:
Esta solución es un poco mejor. Se va a hacer un nuevo método que calcule todos los números de la sucesión de Fibonacci menores que un máximo max pero que sólo almacene aquellos que pasen una condición que se le pasa como bloque:
-
def fib2(max,a=1,b=1)
-
arr = []
-
arr <<a if yield(a)
-
while(b<max) do
-
arr <<b if yield(b)
-
a,b=b,a+b
-
end
-
arr
-
end
Después sólo hace falta pasar el filtro adecuado, y sumar los resultados:
-
def euler2b(max,a=1,b=1)
-
fib2(max,a,b){|x| x%2==0}.inject{|memo,obj| memo+obj}
-
end
-
-
puts euler2b(4e6)
Tercera solución:
Esta tercera solución es una modificación directa de la segunda. En vez de almacenar los datos, se suman directamente.
-
def fib3(max,a=1,b=1)
-
res = 0
-
res += a if yield(a)
-
while(b<max) do
-
res += b if yield(b)
-
a,b=b,a+b
-
end
-
res
-
end
-
-
def euler2c(max,a=1,b=1)
-
fib3(max,a,b){|x| x%2==0}
-
end
-
-
puts euler2c(4e6)
Y eso es todo.
Actualización: Hay diferencias entre la página de PyEuler y la del Proyecto Euler. El problema ha sido actualizado para corresponderse con esta última.
Gráficos de radar o de araña con Gruff
Gruff es una librería de Ruby para realizar gráficos. Es muy simple de usar, pero para ello, primero se ha de instalar. Nada más fácil:
sudo gem install gruff
Una vez instalado, se puede usar uno de los múltiples tutoriales que hay por Internet. Yo, por mi lado, me he decidido a hacer uno de un gráfico aún experimental: el gráfico de radar o de araña.
En primer lugar, importamos las librerías necesarias:
-
require 'rubygems'
-
require "gruff"
Para seguir, creamos el objeto necesario y le damos título:
-
g = Gruff::Spider.new 10
-
g.title = "Calificaciones"
Ahora, añadimos los datos. El primer parámetro es el nombre que va a aparecer al lado del dato en cuestión. El segundo es un array de datos numéricos, en el caso que nos ocupa, es un simple número. Hay un tercer parámetro opcional: el color en hexadecimal.
-
g.data "Matemáticas", 8.5
-
g.data "Historia", 6.7
-
g.data "Lengua y Literatura", 5.3
-
g.data "Eduación Física", 4.8
-
g.data "Física y Química", 8.9
-
g.data "Religión", 10
Ahora ya sólo queda guardar la imagen, lo cual es muy fácil. Simplemente:
-
g.write('marks.png')
He aquí el resultado (algunas letras se tapan con las líneas puesto que aún está en fase experimental):
En mi máquina, la media de ejecutarlo 100 veces es 0.32048496 segundos, el máximo es 0.40913s y el mínimo, 0.314553s.
Y eso es to, eso es to, eso es todo amigos.
Tweets del 16-03-2008
- Aprende Programación Online Gratis http://tinyurl.com/35huo8 #
- La colección de los "Hola, Mundo" http://tinyurl.com/zots7 #
Tweets del 12-03-2008
- Explicación rápida de un script de Python para programadores http://tinyurl.com/2kcs5k #
- Las 15 mejores aplicaciones freeware para Mac http://tinyurl.com/2p723g #
Tweets del 29-02-2008
- Tutorial de Threads de Control http://www.programacion.net/java/tutorial/threads/ #
- Ventanas translúcidas y con forma en Java http://tinyurl.com/37aoqy #
Problema 1
Empiezo aquí una serie de artículos de periodicidad variable que lo único que pretende es ser algo similar (de una manera muy amplia) a PyEuler. La lista completa de problemas está en el Proyecto Euler y, como no podía ser de otra manera, empiezo por el primero.
Enunciado:
Halla la suma de todos los números menores que 1000 y múltiplos de 3 o de 5.
Solución 1:
-
def euler1a(e, numbers)
-
(1..e).select{|x| numbers.any?{|y| (x%y == 0)}}.inject{|memo,o| memo+=o}
-
end
-
-
puts euler1a(1000,[3,5])
La explicación es simple. Tenemos un rango desde 1 hasta el límite, filtramos los que son múltiplos de algún elemento del array y después se suman.
Solución 2:
-
def euler1b(e,numbers)
-
(1..e).inject(0){|memo,o| (numbers.any?{|x| (o%x)==0}) ? memo+o : memo }
-
end
-
-
puts euler1b(1000,[3,5])
Éste es similar al anterior, sólo que se suma según se recorre el rango.
Solución 3:
Para este necesitamos antes un par de funciones. La primera, halla el máximo común divisor de dos números. Para ello, básicamente usa el algoritmo de Euclides.
-
def mcd(n1,n2)
-
if n1 <n2
-
mcd(n2,n1)
-
elsif (n1%n2) == 0
-
n2
-
else
-
mcd(n2,n1%n2)
-
end
-
end
Por otra parte, está la función que calcula el mínimo común múltiplo. Para ello usa su relación con el m.c.d..
-
def mcm(n1,n2)
-
n1*n2/mcd(n1,n2)
-
end
Con esto, ya podemos pasar a la tercera solución, que es diferente de las otras dos en que sólo sirve si utilizamos dos números como filtro.
-
def euler1c(limit, n1, n2)
-
(n1*((limit/n1)*((limit/n1)+1)/2)+n2*((limit/n2)*((limit/n2)+1)/2)-mcm(n1,n2)*((limit/mcm(n1,n2))*((limit/mcm(n1,n2))+1)/2))
-
end
-
-
puts euler1c(1000,3,5)
La explicación es un poco más complicada, pues implica teoría básica de conjuntos y la conocida fórmula de la suma de 1 a n.
Ahora es vuestro turno. ¿Cómo se os ocurre hacerlo?
Tweets del 24-02-2008
- Cupones de descuento http://www.retailmenot.com/ #
- Gregory Freeman || Gordon House http://tinyurl.com/33h2zx #
- Diccionario del escéptico http://www.skepdic.com/tilogic.html #
- 100 Kirbies http://www.vgcats.com/comics/ #
- Evolución de Nintendo http://tinyurl.com/2pbzgj #
- El mensaje de Arecibo explicado http://tinyurl.com/3yut35 #
- Los 10 mejores trucos de CSS http://tinyurl.com/3c8lmp #
- Manual de Vim http://www.moolenaar.net/habits.html #
- Cómo leer declaraciones en C http://tinyurl.com/2johzr #
- Manual de ANTLR http://tinyurl.com/3bz4hz #
"Sólo los débiles hacen copias de seguridad en cintas, los hombres de verdad suben sus cosas importantes a un ftp y permiten que el resto del mundo haga un mirror ;)"
Linus Torvalds