Monday, January 12, 2009

Erlang solution for Euler problem 8

Euler problem 8 asks us to find the greatest product of five consecutive digits in a given 1000-digit number.

Once again, we solve it using the obvious brute force method. The one interesting aspect of this problem is that it is the first problem in which we can make use of Erlang's list processing and pattern matching.

Here is my solution:

%% Project Euler, problem 8
%%
%% Find the greatest product of five consecutive digits in a given 1000-digit number.

-module(euler8).
-author('Cayle Spandon').

-export([solve/0]).

-define(NUMBER, "73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450").

stringToNumber([H|T]) ->
[ H - $0 | stringToNumber(T) ];

stringToNumber([]) ->
[].

findBiggestProductOf5Digits([A,B,C,D,E|T], BiggestProduct) ->
Product = A * B * C * D * E,
Rest = [B, C, D, E | T],
if
Product > BiggestProduct -> findBiggestProductOf5Digits(Rest, Product);
true -> findBiggestProductOf5Digits(Rest, BiggestProduct)
end;

findBiggestProductOf5Digits([_A,_B,_C,_D], BiggestProduct) ->
BiggestProduct.

solve() ->
findBiggestProductOf5Digits(stringToNumber(?NUMBER), 0).

No comments: