Run-length encoding: Difference between revisions

Content added Content deleted
(→‎{{header|Haskell}}: Added a variant expressed in terms of span.)
Line 2,429: Line 2,429:


=={{header|Haskell}}==
=={{header|Haskell}}==
===Version 1===
===In terms of group===
<lang haskell>import Data.List (group)
<lang haskell>import Data.List (group)
import Control.Arrow ((&&&))
import Control.Arrow ((&&&))
Line 2,454: Line 2,454:
decoded = rldecode encoded
decoded = rldecode encoded
putStrLn $ "Encoded: " ++ show encoded ++ "\nDecoded: " ++ show decoded</lang>
putStrLn $ "Encoded: " ++ show encoded ++ "\nDecoded: " ++ show decoded</lang>

===Version 2===
Or:
<lang Haskell>
<lang Haskell>
import Data.List
import Data.List
Line 2,477: Line 2,478:
test: text == decode => True
test: text == decode => True
</pre>
</pre>

===In terms of span===
<lang haskell>import Data.Char (isDigit)
import Data.List (span)

encode :: String -> String
encode [] = []
encode (x : xs) = x : (show . succ . length) run <> encode rest
where
(run, rest) = span (x ==) xs

decode [] = []
decode (x : xs) = replicate n x <> decode rest
where
(ds, rest) = span isDigit xs
n = read ds :: Int

main :: IO ()
main =
putStrLn encoded
>> putStrLn decoded
>> print (src == decoded)
where
src = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
encoded = encode src
decoded = decode encoded</lang>
{{Out}}
<pre>W12B1W12B3W24B1W14
WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW
True</pre>


=={{header|Icon}} and {{header|Unicon}}==
=={{header|Icon}} and {{header|Unicon}}==