burrows-wheeler_transform.sf 838 B

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Burrows–Wheeler_transform
  4. #
  5. class BurrowsWheelerTransform (String L = "\002") {
  6. method encode(String s) {
  7. assert(!s.contains(L), "String cannot contain `#{L.dump}`")
  8. s = (L + s)
  9. s.len.of{|i| s.substr(i) + s.substr(0, i) }.sort.map{.last}.join
  10. }
  11. method decode(String s) {
  12. var t = s.len.of("")
  13. var c = s.chars
  14. { t = (c »+« t).sort } * s.len
  15. t.first { .begins_with(L) }.substr(L.len)
  16. }
  17. }
  18. var tests = [
  19. "banana", "appellee", "dogwood", "TOBEORNOTTOBEORTOBEORNOT"
  20. "SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES",
  21. ]
  22. var bwt = BurrowsWheelerTransform(L: '$')
  23. tests.each { |str|
  24. var enc = bwt.encode(str)
  25. var dec = bwt.decode(enc)
  26. say "BWT(#{dec.dump}) = #{enc.dump}"
  27. assert_eq(str, dec)
  28. }