lauflaengencodierung.hs 599 B

12345678910111213141516171819202122
  1. splitWhen :: (a -> Bool) -> [a] -> ([a], [a])
  2. splitWhen _ [] = ([], [])
  3. splitWhen p (x:xs)
  4. | p x = ([], x:xs)
  5. | otherwise = let (ys, zs) = splitWhen p xs
  6. in (x:ys, zs)
  7. -- >>> splitWhen even [1,2,3]
  8. -- ([1],[2,3])
  9. group :: Eq a => [a] -> [[a]]
  10. group [] = []
  11. group (x:xs) = let (group1, rest) = splitWhen (/=x) xs
  12. in (x:group1) : group rest
  13. encode :: Eq a => [a] -> [(a, Int)]
  14. encode xs = map (\x -> (head x, length x)) (group xs)
  15. decode [] = []
  16. decode ((x,n):xs) = replicate n x ++ decode xs
  17. -- alternativ
  18. decode = concat . (map (\(x,n)->replicate n x))