Run-length encoding: Difference between revisions

→‎{{header|Haskell}}: Added a variant expressed in terms of span.
(→‎{{header|Haskell}}: Added a variant expressed in terms of span.)
Line 2,429:
 
=={{header|Haskell}}==
===VersionIn 1terms of group===
<lang haskell>import Data.List (group)
import Control.Arrow ((&&&))
Line 2,454:
decoded = rldecode encoded
putStrLn $ "Encoded: " ++ show encoded ++ "\nDecoded: " ++ show decoded</lang>
 
===Version 2===
Or:
<lang Haskell>
import Data.List
Line 2,477 ⟶ 2,478:
test: text == decode => True
</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}}==
9,655

edits