aprendiendo ( Erlang ).

jueves, 24 de noviembre de 2011

Proyecto Euler. Problema 1.

| 0 comentarios |

Dice el propio sitio web:

"Project Euler existe para animar, desafiar y desarrollar las habilidades y el disfrute de cualquier persona interesada en el fascinante mundo de las matemáticas."

Se trata de un sitio web en el que te proponen problemas y retos matemáticos a resolver. Para mi propósito, aprender Erlang, me viene muy bien. Ya que los problemas matemáticos son perfectos para resolverlos con lenguajes funcionales. Así pues, resolveré algunos problemas de dicha web.
El problema siguiente es tomado del Proyecto Euler:

Encontrar la suma de todos los múltiplos de 3 o 5 menores de 1000.

Este problema es ideal para resolverlo mediante listas por comprensión. Y es fascinante, una vez encontrada la solución, lo simple que resulta.
-module(p1).
-export([descripcion/0, solucion/0, solucion/1]).

-define(DESCRIPCION, ["Si tenemos una lista de todos los números naturales menores que 10 ",
                      "que son múltiplos de 3 o 5, son:  3, 5, 6 y 9. La suma de estos múltiplos es 23.",
                      "Encontrar la suma de todos los múltiplos de 3 o 5 por debajo de 1000."]).

descripcion() ->
    lists:foreach ( fun(X) ->
                            io:format("~p~n", [X])
                    end, 
                    ?DESCRIPCION).

solucion() ->
    solucion(1000).

solucion(Menores_que) ->
    Multiplos = [ X || X <- lists:seq(1,Menores_que -1), (X rem 3 == 0) or (X rem 5 == 0) ],
    lists:sum(Multiplos).

1> c(p1). {ok,p1} 2> p1:descripcion(). "Si tenemos una lista de todos los números naturales menores que 10 " "que son múltiplos de 3 o 5, son: 3, 5, 6 y 9. La suma de estos múltiplos es 23." "Encontrar la suma de todos los múltiplos de 3 o 5 por debajo de 1000." ok 3> p1:solucion(10). 23 4> p1:solucion(). 233168
Como habrás observado he definido una macro DESCRIPCION para tener la descripción del problema y una función descripcion/0 para imprimirla. Esta función la incorporaré en todos los problemas que resuelva.
También tendré una función solucion/0 que resuelve el problema. En la función solucion/1 resuelvo el problema de forma genérica para cualquier valor.
La solución es sencilla de entender. Se trata de generar la lista de todos los múltiplos de 3 y/o 5 menores que un numero dado. Mi lista por compresión tendrá un generador para todos los número desde 1 al X-1 y un filtro que comprueba si un elemento en cuestión es multó de 3 ó 5.
[ X || X <- lists:seq(1,Menores_que -1), (X rem 3 == 0) or (X rem 5 == 0) ]
Una vez obtenido la lista sólo tenemos que sumar sus elementos.

Publicar un comentario

0 comentarios:

 
Licencia Creative Commons
Aprendiendo Erlang por Verdi se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported.