Permutations/Rank of a permutation: Difference between revisions

m
→‎{{header|Haskell}}: Simplified `foldr (*) 1` to `product`
m (→‎{{header|Haskell}}: Simplified `foldr (*) 1` to `product`)
Line 675:
=={{header|Haskell}}==
Without the random part.
<lang haskell>fact n:: =Int foldr-> (*) 1 [1..n]Int
fact n = product [1 .. n]
 
-- alwaysAlways assume elements are unique.
 
-- always assume elements are unique
rankPerm [] _ = []
rankPerm list n = c : rankPerm (a ++ b) r where
where
(q,r) = n `divMod` fact (length list - 1)
(aq,c:b r) = splitAtn q`divMod` fact (length list - 1)
(a, c:b) = splitAt q list
 
permRank [] = 0
permRank (x:xs) = length (filter (< x) xs) * fact (length xs) + permRank xs
 
main =:: mapM_IO f [0..23] where()
main = mapM_ f [0 .. 23]
f n = print (n, p, permRank p) where
where
p = rankPerm [0..3] n</lang>
f n = print (n, p, permRank p) where
where
p = rankPerm [0 .. 3] n</lang>
{{out}}
from rank to permutation back to rank:
9,659

edits