Run-length encoding

You are encouraged to solve this task according to the task description, using any language you may know.


Task

Given a string containing uppercase characters (A-Z), compress repeated 'runs' of the same character by storing the length of that run, and provide a function to reverse the compression.

The output can be anything, as long as you can recreate the input with it.



Example

 Input: WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW
 Output: 12W1B12W3B24W1B14W


Note: the encoding step in the above example is the same as a step of the Look-and-say sequence.




runlengthEncode: function [s][
    join map chunk split s => [&] 'x ->
        (to :string size x) ++ first x
]
 
runlengthDecode: function [s][
    result: new ""
    loop (chunk split s 'x -> positive? size match x {/\d+/}) [a,b] ->
        'result ++ repeat first b to :integer join to [:string] a
    return result
]
 
str: "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
 
encoded: runlengthEncode str
print ["encoded:" encoded]
 
decoded: runlengthDecode encoded
print ["decoded:" decoded]
 
if decoded=str -> print "\nSuccess!"