Advertisement
banovski

Quick, reliable pseudo-shuffler (enhanced)

Feb 29th, 2024
993
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haskell 0.84 KB | Source Code | 0 0
  1. import Data.Function
  2. import Data.List
  3. import Data.List.Split
  4.  
  5. orderLists :: [a] -> [a] -> ([a], [a])
  6. orderLists xs ys
  7.   | on compare length xs ys == LT = (xs, ys)
  8.   | otherwise = (ys, xs)
  9.  
  10. listsLengthQuotient :: ([a], [a]) -> ([a], [a], Int)
  11. listsLengthQuotient (xs, ys) =
  12.   (xs, ys, (round $ on (/) (fromIntegral . length) ys xs) :: Int)
  13.  
  14. groupListItems :: ([a], [a], Int) -> ([[a]], [[a]])
  15. groupListItems (xs, ys, q) = (chunksOf 1 xs, chunksOf q ys)
  16.  
  17. merge :: ([a], [a]) -> [a]
  18. merge (xs, []) = xs
  19. merge ([], ys) = ys
  20. merge (x:xs, y:ys) = x : y : merge (xs, ys)
  21.  
  22. mixLists :: [a] -> [a] -> [a]
  23. mixLists xs ys =
  24.   concat $ merge $ groupListItems $ listsLengthQuotient $ orderLists xs ys
  25.  
  26. main :: IO ()
  27. main = do
  28.   input <- getContents
  29.   mapM_ putStrLn $
  30.     foldl1 mixLists $ sortBy (on compare length) (group . sort $ lines input)
  31.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement