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.




import parseutils, strutils
 
proc compress(input: string): string =
  var
    count = 1
    prev = '\0'
 
  for ch in input:
    if ch != prev:
      if prev != '\0':
        result.add $count & prev
      count = 1
      prev = ch
    else:
      inc count
  result.add $count & prev
 
proc uncompress(text: string): string =
  var start = 0
  var count: int
  while true:
    let n = text.parseInt(count, start)
    if n == 0 or start + n >= text.len:
      raise newException(ValueError, "corrupted data.")
    inc start, n
    result.add repeat(text[start], count)
    inc start
    if start == text.len: break
 
 
const Text = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
 
echo "Text:         ", Text
let compressed = Text.compress()
echo "Compressed:   ", compressed
echo "Uncompressed: ", compressed.uncompress()