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.