RosettaCodeData/Task/Run-length-encoding/Haskell/run-length-encoding-1.hs

23 lines
740 B
Haskell

import Data.List (group)
-- Datatypes
type Encoded = [(Int, Char)] -- An encoded String with form [(times, char), ...]
type Decoded = String
-- Takes a decoded string and returns an encoded list of tuples
rlencode :: Decoded -> Encoded
rlencode = fmap ((,) <$> length <*> head) . group
-- Takes an encoded list of tuples and returns the associated decoded String
rldecode :: Encoded -> Decoded
rldecode = concatMap (uncurry replicate)
main :: IO ()
main = do
let input = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
-- Output encoded and decoded versions of input
encoded = rlencode input
decoded = rldecode encoded
putStrLn $ "Encoded: " <> show encoded <> "\nDecoded: " <> show decoded