Hola:
Ayer llegué al sitio de PyEuler [1] y pienso que es una buena manera
de profundizar en cualquier lenguaje de programación, por lo que pensé
en crear RbEuler [2]. De momento sólo he hecho el primer problema (de
tres maneras distintas, unas más eficientes, y otras más rápidas).
Pensé que es una buena excusa para empezar una discusión sobre esas
funciones que tiene ruby que hacen la vida más fácil (muchas de las
que utiliza PyEuler a través del módulo itertools están directamente
en el Enumerable de ruby).
El primer problema es:
Halla la suma de todos los números menores que 1000 y múltiplos de 3 o de 5.
Y las soluciones que propongo, son:
def euler1a(e, numbers)
(1…e).select{|x| numbers.any?{|y| (x%y == 0)}}.inject{|memo,o|
memo+=o}
end
def euler1b(e,numbers)
(1…e).inject(0){|memo,o| (numbers.any?{|x| (o%x)==0}) ? memo+o : memo
}
end
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
Siendo mcm(n1,n2) el mínimo común múltiplo de n1 y n2. Sé que este
último se puede mejorar simplemente metiendo en variables las
operaciones repetidas, pero sólo pretendía mostrar otra forma de
hacerlo.
Espero no molestar a nadie. Un saludo,
Serabe
P.D. El listado completo de problemas está en Proyecto Euler [3].
[1] http://pyeuler.wikidot.com/
[2] http://www.serabe.com/rbeuler/
[3] http://projecteuler.net/