Project Euler #35

To create the rotations I make a "detour" by converting the number into a string and then performing the rotations on the string.

#light

let primes_below v = Euler_utils.primes |> Seq.takeWhile (fun p -> p < v) |> Set.of_seq

let rotate number =
    let number_str = number.ToString()
    let len = number_str.Length - 1
    seq { for i in [ 1..len ] do
              yield int64 (number_str.Substring(i) + number_str.Substring(0,i))
    }

let has_rotated set number =
    let numbers = rotate number
    Seq.forall (fun v -> Set.contains v set) numbers

let find_rotate_numbers number_set = 
    number_set
    |> Set.filter (fun n -> has_rotated number_set n) 

let rec filter_rotations number_set =
    let numbers = Seq.to_list number_set
    match numbers with
    | head :: tail -> let rotated = rotate head
                      let f_number_set = (Set.remove head number_set) - Set.of_seq rotated 
                      head :: (filter_rotations f_number_set)
    | [] -> []

let values = (find_rotate_numbers (primes_below 1000000L))

values |> Set.iter (fun v -> printfn "Value %A" v )
printfn "Values %A" values

As you might notice, I have included the function filter_rotations which takes only one of each "rotation group". However, this is not part of the problem and this therefore not used to compute the final answer.

You can use the comment system below or send my an email mic.jacobsen@gmail.com

comments powered by Disqus

Pages

Tags

Last Tweets

A word from our sponsor