Project Euler 40: Champernowne’s constant

Det hade gått snabbare att lösa detta problem med papper och penna än igenom att skriva ett program som löser det. Jag använde en hybridlösning och löste en del av problemet manuellt och en del igenom programmering.

An irrational decimal fraction is created by concatenating the positive integers:

0.123456789101112131415161718192021…

It can be seen that the 12th digit of the fractional part is 1.

If dn represents the nth digit of the fractional part, find the value of the following expression.

d_1 × d_10 × d_100 × d_1000 × d_10000 × d_100000 × d_1000000

Länk till problemet

Jag har tvingats ersätta vänsterpil med – eftersom wordpress uppenbarligen inte underhålls av en erlangprogrammerare.

     
problem_40() ->
    Start = os:timestamp(),
    Digits = lists:flatten([integer_to_list(X) || X - lists:seq(1, 185186)]),
    Resultat = lists:foldl(fun(X, Sum) -> (lists:nth(X,Digits)-48) * Sum end, 1, [1,10,100,1000,10000,100000,1000000]),
    io:format("Svaret är ~p och tog ~f sekunder att berakna~n", [Resultat, timer:now_diff(os:timestamp(), Start) / 1000000]),
    Start2 = os:timestamp(),
    Digits2 = lists:flatten([integer_to_list(X) || X - lists:seq(1, 185186)]),
    Resultat2 = multiply(Digits2, 1),
    io:format("Svaret är ~p och tog ~f sekunder att berakna~n", [Resultat2, timer:now_diff(os:timestamp(), Start2) / 1000000]).

multiply(_, 10000000) -> 1;
multiply(Digits, Place) ->
(lists:nth(Place, Digits)-48) * multiply(Digits, Place*10).

Länk till github

Att det den miljonte siffran finns i talet 185186 kan man enkelt räkna ut med papper och penna. Börja med att talen 1-9 innehåller 9 siffror. Det finns 99 siffror med två tal eller färre och 9 av dem har vi redan räknat vilket ger oss totalt 189 tal mellan 1 och 99. Fortsätt på samma sätt tills du har hittat den miljonte siffran.

Jag löste resten av problemet med två olika lösningar. Den ena lösningen använder lists:foldl och den andra använder rekursion. Intressant är att den rekursiva lösningen är en aningen snabbare, den tar 0.08 sekunder jämfört med foldl-lösningen som tar cirka 0.1 sekunder.

/André

Leave a comment