document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. let divides divisor number =
  2.     divisor <> number && number % divisor = 0
  3.  
  4. let rec sieve multiples potential_primes =
  5.     match multiples with
  6.     | first :: rest -> sieve rest (List.filter ((divides first) >> not) potential_primes)
  7.     | [] -> potential_primes
  8.  
  9. let primesUpTo n =
  10.     let upper_bound = int (sqrt (float n))
  11.     let candidates = 2::[3 .. 2 .. n]
  12.     sieve (List.takeWhile (fun n -> n < upper_bound) candidates) candidates
  13.    
  14. let calculate_sums (numbers: list<int>) max_sum n =
  15.     Seq.windowed n numbers |> Seq.map Seq.sum |> Seq.takeWhile (fun sum -> sum <= max_sum) |> Set.ofSeq
  16.  
  17. let solve windows upper_bound =
  18.     let primes = primesUpTo upper_bound
  19.     let max_prime = List.rev primes |> List.head
  20.     let sums = windows |> Seq.map (calculate_sums primes max_prime)
  21.     Set.intersectMany sums |> Set.minElement
  22.    
  23. solve [7; 17; 41; 541] 10000000
');