#### Problem

*The cube, 41063625 (345*^{3}), can be permuted to produce two other cubes: 56623104 (384^{3}) and 66430125 (405^{3}). In fact, 41063625 is the smallest cube which has exactly three permutations of its digits which are also cube.

*Find the smallest cube for which exactly five permutations of its digits are cube.*

#### Solution

open System
let cubeRoot (n:int64) = Math.Pow(double(n), 1.0/3.0)
// define function to investigate the numbers of d digits which are cubes
let f d =
// find the min & max number whose cube is d digits long
let min, max = int64(cubeRoot (pown 10L d)), int64(cubeRoot (pown 10L (d+1)))
// and look for groups of 5 numbers which are cubes and permutations of one another
[min..max]
|> List.map (fun n -> pown n 3)
|> Seq.groupBy (fun n -> n.ToString().ToCharArray() |> Array.sort)
|> Seq.filter (fun (k, l) -> l |> Seq.length = 5)
let answer =
// go through the numbers of a given number of digits and find the first set of groups
// of 5 numbers which are cubes and permutations of one another
let groups =
Seq.unfold (fun state -> Some(state, state+1)) 7
|> Seq.map f
|> Seq.filter (fun l -> Seq.length l > 0)
|> Seq.head
// find the smallest elements in the groups
groups |> Seq.map (fun (k, l) -> l |> Seq.min) |> Seq.min

Your use of groupBy to find the permutations is *extremely* clever.

thank you :-)