run_length_encoding_2.sf 830 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/ruby
  2. # https://rosettacode.org/wiki/Run-length_encoding
  3. func encode (str) {
  4. var input = str.chars;
  5. var encoding = [];
  6. var count = 1;
  7. var prev = input[0];
  8. for (var i = 1; i <= (input.end); i++) {
  9. if (input[i] != prev) {
  10. encoding.push([count, prev]);
  11. count = 1;
  12. prev = input[i];
  13. }
  14. else {
  15. count++;
  16. }
  17. }
  18. encoding.push([count, prev]);
  19. return(encoding);
  20. }
  21. func decode (encoded) {
  22. var output = '';
  23. for i in (encoded) {
  24. output += (i[1] * i[0])
  25. }
  26. return(output);
  27. }
  28. var str = 'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW' -> say;
  29. var encoded = (encode(str)) -> dump -> say;
  30. var decoded = (decode(encoded)) -> say;
  31. str == decoded || ("Failed!\n".die);