13 lines
481 B
Haskell
13 lines
481 B
Haskell
shuffle :: [a] -> [a]
|
|
shuffle lst = let (a,b) = splitAt (length lst `div` 2) lst
|
|
in foldMap (\(x,y) -> [x,y]) $ zip a b
|
|
|
|
findCycle :: Eq a => (a -> a) -> a -> [a]
|
|
findCycle f x = takeWhile (/= x) $ iterate f (f x)
|
|
|
|
main = mapM_ report [ 8, 24, 52, 100, 1020, 1024, 10000 ]
|
|
where
|
|
report n = putStrLn ("deck of " ++ show n ++ " cards: "
|
|
++ show (countSuffles n) ++ " shuffles!")
|
|
countSuffles n = 1 + length (findCycle shuffle [1..n])
|