# 99 questions/Solutions/12

### From HaskellWiki

< 99 questions | Solutions(Difference between revisions)

(Fix function name) |
|||

Line 51: | Line 51: | ||

decodeModified = foldl (\acc e -> case e of Single x -> acc ++ [x]; Multiple n x -> acc ++ replicate n x) [] | decodeModified = foldl (\acc e -> case e of Single x -> acc ++ [x]; Multiple n x -> acc ++ replicate n x) [] | ||

</haskell> | </haskell> | ||

+ | |||

+ | |||

+ | [[Category:Programming exercise spoilers]] |

## Revision as of 19:32, 18 January 2014

(**) Decode a run-length encoded list.

Given a run-length code list generated as specified in problem 11. Construct its uncompressed version.

decodeModified :: [ListItem a] -> [a] decodeModified = concatMap decodeHelper where decodeHelper (Single x) = [x] decodeHelper (Multiple n x) = replicate n x

We only need to map single instances of an element to a list containing only one element and multiple ones to a list containing the specified number of elements and concatenate these lists.

A solution for the simpler encoding from problem 10 can be given as:

decode :: [(Int, a)] -> [a] decode = concatMap (uncurry replicate)

This can be easily extended given a helper function:

toTuple :: ListItem a -> (Int, a) toTuple (Single x) = (1, x) toTuple (Multiple n x) = (n, x)

as:

decodeModified :: [ListItem a] -> [a] decodeModified = concatMap (uncurry replicate . toTuple)

foldl

decodeModified :: [ListItem a]-> [a] decodeModified = foldl (\x y -> x ++ decodeHelper y) [] where decodeHelper :: ListItem a -> [a] decodeHelper (Single x) = [x] decodeHelper (Multiple n x) = replicate n x

foldl

decodeModified :: [ListItem a] -> [a] decodeModified = foldl (\acc e -> case e of Single x -> acc ++ [x]; Multiple n x -> acc ++ replicate n x) []