‘Project Euler’ Category Archives
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
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
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
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
5
16
8
4
2
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)
Aug
Project Euler #013
by Mikael Lundin in F#, Project Euler
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)