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.




rle(s)={
  if(s=="", return(s));
  my(v=Vec(s),cur=v[1],ct=1,out="");
  v=concat(v,99); \\ sentinel
  for(i=2,#v,
    if(v[i]==cur,
      ct++
    ,
      out=Str(out,ct,cur);
      cur=v[i];
      ct=1
    )
  );
  out
};
elr(s)={
  if(s=="", return(s));
  my(v=Vec(s),ct=eval(v[1]),out="");
  v=concat(v,99); \\ sentinel
  for(i=2,#v,
    if(v[i]>="0" && v[i]<="9",
      ct=10*ct+eval(v[i])
    ,
      for(j=1,ct,out=Str(out,v[i]));
      ct=0
    )
  );
  out
};
rle("WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW")
elr(%)