Project Euler Problem #14

Longest hailstone sequence with starting number under one-million. let hailstone n = Seq.unfold (function 0L -> None | 1L -> Some(1L, 0L)                                      | n when n % 2L = 0L -> Some(n, n / 2L)                                      | n -> Some(n, 3L * n + 1L)) n let chainLen n = hailstone n |> Seq.length…

2

Project Euler Problem #13

First ten digits of sum of following one-hundred 50-digit numbers. It would be interesting to do without BigInts. Could use doubles with enough precision for just the first ten digits or some such thing, but just wanted the correct answer to plug into the site and I’m lazy 🙂 open System [37107287533902102798797998220837590246510135740250I;  46376937677490009712648124896970078050417018260538I;  74324986199524741059474233309513058123726617309629I;  91942213363574161572522430563301811072406154908250I;…

0

Project Euler Problem #12

First triangle number to have over five hundred divisors. let naturals = Seq.unfold (fun i -> Some(i, i + 1)) 1 // from prob7 let triangleNums = Seq.scan (+) 0 naturals let isFactor n d = n % d = 0 let factors n = seq { 1..int (sqrt (float n)) } |> Seq.filter (isFactor…

0

Project Euler Problem #11

Greatest product of four adjacent numbers (up, down, left, right, or diagonally) in this 20×20 grid: let grid = [|08;02;22;97;38;15;00;40;00;75;04;05;07;78;52;12;50;77;91;08;              49;49;99;40;17;81;18;57;60;87;17;40;98;43;69;48;04;56;62;00;              81;49;31;73;55;79;14;29;93;71;40;67;53;88;30;03;49;13;36;65;              52;70;95;23;04;60;11;42;69;24;68;56;01;32;56;71;37;02;36;91;              22;31;16;71;51;67;63;89;41;92;36;54;22;40;40;28;66;33;13;80;              24;47;32;60;99;03;45;02;44;75;33;53;78;36;84;20;35;17;12;50;              32;98;81;28;64;23;67;10;26;38;40;67;59;54;70;66;18;38;64;70;              67;26;20;68;02;62;12;20;95;63;94;39;63;08;40;91;66;49;94;21;              24;55;58;05;66;73;99;26;97;17;78;78;96;83;14;88;34;89;63;72;              21;36;23;09;75;00;76;44;20;45;35;14;00;61;33;97;34;31;33;95;              78;17;53;28;22;75;31;67;15;94;03;80;04;62;16;14;09;53;56;92;              16;39;05;42;96;35;31;47;55;58;88;24;00;17;54;24;36;29;85;57;              86;56;00;48;35;71;89;07;05;44;44;37;44;60;21;58;51;54;17;58;              19;80;81;68;05;94;47;69;28;73;92;13;86;52;17;77;04;89;55;40;              04;52;08;83;97;35;99;16;07;97;57;32;16;26;26;79;33;27;98;66;              88;36;68;87;57;62;20;72;03;46;33;67;46;55;12;32;63;93;53;69;              04;42;16;73;38;25;39;11;24;94;72;18;08;46;29;32;40;62;76;36;              20;69;36;41;72;30;23;88;34;62;99;69;82;67;59;85;74;04;36;16;             …

2

Project Euler Problem #10

Sum of primes below two-million. Easy problem, but way too slow (taking several minutes) with the naïve prime number generator from problem 7. This new version is 10x faster, based on this paper:http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf (still not implementing the ‘wheel’ though; probably another 3x improvement) let primes =     let rec sieve i c = seq {        …

0

Project Euler Problem #9

Pythagorean triplet where a + b + c = 1000 (2, 1) |> Seq.unfold (fun (m, n) –>     Some([m * m – n * n; 2 * m * n; m * m + n * n],         if n + 1 < m then m, n + 1 else m + 1, 1))…

0

Project Euler Problem #8

Largest products of five consecutive digits in this 1000-digit number. open System.Numerics let digits n = Seq.unfold (fun i –>     if i = 0I then None     else Some(i % 10I, i / 10I)) n let consecutive = Seq.unfold (function     (a : BigInteger) :: (b :: c :: d :: e :: _…

2

Project Euler Problem #7

Find the 10001st prime let naturals = Seq.unfold (fun i -> Some(i, i + 1))let primes =    naturals 2 |> Seq.filter (fun n ->        seq { 2..int (sqrt (float n)) }        |> Seq.forall (fun x -> n % x <> 0))Seq.nth 10000 primes

0

Project Euler Problem #6

Difference between sum of the squares and the square of the sum of 1 – 100:   (fun ns ->     let sqr x = x * x     (sqr (List.sum ns)) – (List.map sqr ns |> List.sum) ) [1..100]

0

Project Euler Problem #5

Smallest number divisible by each of 1 to 20:   First cut (takes almost an hour to execute!): let isFactor n d = n % d = 0 {1..Int32.MaxValue} |> Seq.find (fun n -> [1..20] |> List.forall (isFactor n))   Second cut (takes a millisecond!):   let rec gcd a b = if b =…

0