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}}== |
||
=== |
===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}}== |