delta_encoding_with_unary_coding.sf 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 13 June 2023
  4. # https://github.com/trizen
  5. # Implementation of the Delta encoding scheme, using unary encoding.
  6. # Reference:
  7. # Data Compression (Summer 2023) - Lecture 6 - Delta Compression and Prediction
  8. # https://youtube.com/watch?v=-3H_eDbWNEU
  9. func delta_encode (bytes) {
  10. var deltas = ([0] + bytes -> diffs)
  11. var bitstring = FileHandle.new_buf(:raw)
  12. for d in (deltas) {
  13. if (d == 0) {
  14. bitstring << '0'
  15. }
  16. else {
  17. bitstring << ('1' + ((d < 0) ? '0' : '1') + '1'*(d.abs-1) + '0')
  18. }
  19. }
  20. return bitstring.parent
  21. }
  22. func delta_decode (bitstring) {
  23. var bits = bitstring.chars
  24. var deltas = []
  25. while (bits) {
  26. var bit = bits.shift
  27. if (bit == '0') {
  28. deltas << 0
  29. }
  30. else {
  31. var bit = bits.shift
  32. var n = (^Inf -> first { bits.shift != '1' })+1
  33. deltas << ((bit == '1') ? n : -n)
  34. }
  35. }
  36. deltas.acc
  37. }
  38. var str = "TOBEORNOTTOBEORTOBEORNOT"
  39. var enc = delta_encode(str.bytes)
  40. var dec = delta_decode(enc)
  41. say "Encoded: #{enc}"
  42. say "Decoded: #{dec.pack('C*')}"
  43. assert_eq(dec.pack('C*'), str)
  44. do {
  45. var str = File(__FILE__).read(:raw)
  46. var encoded = delta_encode(str.bytes)
  47. var decoded = delta_decode(encoded)
  48. assert_eq(str, decoded.pack('C*'))
  49. }
  50. __END__
  51. Encoded: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111101011110101111111111110111101111111111101111010111011011111100101111010111111111111011110111111111110111101110101111010111111111111011110111111111110111101011101101111110
  52. Decoded: TOBEORNOTTOBEORTOBEORNOT