‘Project Euler’ Category Archives

21
Aug

Project Euler #017

by Mikael Lundin in F#, Project Euler

If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.

If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?

let dictionary =
    [
    (1000, "one thousand");
    (90, "ninety");
    (80, "eighty");
    (70, "seventy");
    (60, "sixty");
    (50, "fifty");
    (40, "forty");
    (30, "thirty");
    (20, "twenty");
    (19, "nineteen");
    (18, "eighteen");
    (17, "seventeen");
    (16, "sixteen");
    (15, "fifteen");
    (14, "fourteen");
    (13, "thirteen");
    (12, "twelve");
    (11, "eleven");
    (10, "ten");
    (9, "nine");
    (8, "eight");
    (7, "seven");
    (6, "six");
    (5, "five");
    (4, "four");
    (3, "three");
    (2, "two");
    (1, "one");
    ];

let rec translate (n:int) : string =
    if n = 0 then
        System.String.Empty
    elif dictionary |> List.exists (fun (x, s) -> x = n) then
        snd (dictionary |> List.find (fun (x, s) -> n = x)) + " "
    else
        let log10 x = x |> float |> System.Math.Log10 |> System.Math.Truncate
        let first_number x = System.Math.Truncate((x |> float) / (10.0 ** log10 x))
        let part x = (first_number x) * 10.0 ** log10 x |> int

        if 2.0 = log10 n then
            let rest = translate (n - part n)
            translate (first_number n |> int) + "hundred " + if System.String.IsNullOrWhiteSpace(rest) then "" else "and " + rest
        else
            (translate (part n)) + (translate (n - (part n)))

(List.fold (fun acc n -> acc + translate n) "" [1..1000]).Replace(" ", System.String.Empty).Length
20
Aug

Project Euler #015

by Mikael Lundin in F#, Project Euler

Starting in the top left corner of a 2×2 grid, there are 6 routes (without backtracking) to the bottom right corner.

How many routes are there through a 20×20 grid?

let rec find_path square_size x y =
    let complete = x = square_size || y = square_size
    match complete with
    | true -> 1L
    | false -> (find_path square_size (x + 1) y) + find_path square_size x (y + 1)

// This will take some time
find_path 20 0 0
20
Aug

Project Euler #016

by Mikael Lundin in F#, Project Euler

215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26.

What is the sum of the digits of the number 21000?

let rec exp n e =
    match e = 0 with
    | true  -> 1I
    | false -> n * exp n (e - 1) 

let sum n =
    n |> string |> Seq.fold (fun acc x -> acc + System.Int32.Parse(x |> string)) 0

exp 2I 1000 |> sum
18
Aug

Project Euler #014

by Mikael Lundin in F#, Project Euler

The following iterative sequence is defined for the set of positive integers:

n → n/2 (n is even)
n → 3n + 1 (n is odd)

Using the rule above and starting with 13, we generate the following sequence:

13 → 40 → 20 → 10 →→ 16 →→→→ 1

It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.

Which starting number, under one million, produces the longest chain?

let rec calculate_length (n:int64) =
    let even_f x = x / 2L
    let odd_f x = 3L * x + 1L
    let is_even = n % 2L = 0L
    if n = 1L then
        1
    else
        if is_even then
            1 + calculate_length (even_f n)
        else
            1 + calculate_length (odd_f n)

let rec find_longest n greatest =
    if n = 1000000 then
        fst greatest
    else
        let length = calculate_length (n |> int64)
        if length > (snd greatest) then
            find_longest (n + 1) (n, length)
        else
            find_longest (n + 1) greatest

find_longest 1 (0,0)
18
Aug

Project Euler #013

by Mikael Lundin in F#, Project Euler

Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.

37107287533902102798797998220837590246510135740250
46376937677490009712648124896970078050417018260538

let data = [
    "37107287533902102798797998220837590246510135740250";
    "46376937677490009712648124896970078050417018260538";
    "74324986199524741059474233309513058123726617309629";
    "91942213363574161572522430563301811072406154908250";
    "23067588207539346171171980310421047513778063246676";
    "89261670696623633820136378418383684178734361726757";
    "28112879812849979408065481931592621691275889832738";
    "44274228917432520321923589422876796487670272189318";
    "47451445736001306439091167216856844588711603153276";
    "70386486105843025439939619828917593665686757934951";
    "62176457141856560629502157223196586755079324193331";
    "64906352462741904929101432445813822663347944758178";
    "92575867718337217661963751590579239728245598838407";
    "58203565325359399008402633568948830189458628227828";
    "80181199384826282014278194139940567587151170094390";
    "35398664372827112653829987240784473053190104293586";
    "86515506006295864861532075273371959191420517255829";
    "71693888707715466499115593487603532921714970056938";
    "54370070576826684624621495650076471787294438377604";
    "53282654108756828443191190634694037855217779295145";
    "36123272525000296071075082563815656710885258350721";
    "45876576172410976447339110607218265236877223636045";
    "17423706905851860660448207621209813287860733969412";
    "81142660418086830619328460811191061556940512689692";
    "51934325451728388641918047049293215058642563049483";
    "62467221648435076201727918039944693004732956340691";
    "15732444386908125794514089057706229429197107928209";
    "55037687525678773091862540744969844508330393682126";
    "18336384825330154686196124348767681297534375946515";
    "80386287592878490201521685554828717201219257766954";
    "78182833757993103614740356856449095527097864797581";
    "16726320100436897842553539920931837441497806860984";
    "48403098129077791799088218795327364475675590848030";
    "87086987551392711854517078544161852424320693150332";
    "59959406895756536782107074926966537676326235447210";
    "69793950679652694742597709739166693763042633987085";
    "41052684708299085211399427365734116182760315001271";
    "65378607361501080857009149939512557028198746004375";
    "35829035317434717326932123578154982629742552737307";
    "94953759765105305946966067683156574377167401875275";
    "88902802571733229619176668713819931811048770190271";
    "25267680276078003013678680992525463401061632866526";
    "36270218540497705585629946580636237993140746255962";
    "24074486908231174977792365466257246923322810917141";
    "91430288197103288597806669760892938638285025333403";
    "34413065578016127815921815005561868836468420090470";
    "23053081172816430487623791969842487255036638784583";
    "11487696932154902810424020138335124462181441773470";
    "63783299490636259666498587618221225225512486764533";
    "67720186971698544312419572409913959008952310058822";
    "95548255300263520781532296796249481641953868218774";
    "76085327132285723110424803456124867697064507995236";
    "37774242535411291684276865538926205024910326572967";
    "23701913275725675285653248258265463092207058596522";
    "29798860272258331913126375147341994889534765745501";
    "18495701454879288984856827726077713721403798879715";
    "38298203783031473527721580348144513491373226651381";
    "34829543829199918180278916522431027392251122869539";
    "40957953066405232632538044100059654939159879593635";
    "29746152185502371307642255121183693803580388584903";
    "41698116222072977186158236678424689157993532961922";
    "62467957194401269043877107275048102390895523597457";
    "23189706772547915061505504953922979530901129967519";
    "86188088225875314529584099251203829009407770775672";
    "11306739708304724483816533873502340845647058077308";
    "82959174767140363198008187129011875491310547126581";
    "97623331044818386269515456334926366572897563400500";
    "42846280183517070527831839425882145521227251250327";
    "55121603546981200581762165212827652751691296897789";
    "32238195734329339946437501907836945765883352399886";
    "75506164965184775180738168837861091527357929701337";
    "62177842752192623401942399639168044983993173312731";
    "32924185707147349566916674687634660915035914677504";
    "99518671430235219628894890102423325116913619626622";
    "73267460800591547471830798392868535206946944540724";
    "76841822524674417161514036427982273348055556214818";
    "97142617910342598647204516893989422179826088076852";
    "87783646182799346313767754307809363333018982642090";
    "10848802521674670883215120185883543223812876952786";
    "71329612474782464538636993009049310363619763878039";
    "62184073572399794223406235393808339651327408011116";
    "66627891981488087797941876876144230030984490851411";
    "60661826293682836764744779239180335110989069790714";
    "85786944089552990653640447425576083659976645795096";
    "66024396409905389607120198219976047599490197230297";
    "64913982680032973156037120041377903785566085089252";
    "16730939319872750275468906903707539413042652315011";
    "94809377245048795150954100921645863754710598436791";
    "78639167021187492431995700641917969777599028300699";
    "15368713711936614952811305876380278410754449733078";
    "40789923115535562561142322423255033685442488917353";
    "44889911501440648020369068063960672322193204149535";
    "41503128880339536053299340368006977710650566631954";
    "81234880673210146739058568557934581403627822703280";
    "82616570773948327592232845941706525094512325230608";
    "22918802058777319719839450180888072429661980811197";
    "77158542502016545090413245809786882778948721859617";
    "72107838435069186155435662884062257473692284509516";
    "20849603980134001723930671666823555245252804609722";
    "53503534226472524250874054075591789781264330331690"
    ]

let sum = data |> List.map (fun s -> System.Int64.Parse(s.Substring(0, 15))) |> List.sum
(sum |> string).Substring(0, 10)