1. Homepage
  2. Articoli
  3. Video
  4. Bash scripting
  5. Sistema
  6. Tips
  7. News


Trasformata di Burrows-Wheeler con Ruby

» Author: Andrea Ganduglia Date: 2009-06-10 13:40:52 Copyright: (c)2009 Andrea Ganduglia

Il #codice riportato di seguito mostra una possibile implementazione Ruby della trasformata di Burrows-Wheeler. Il listato è piuttosto compatto e segue quanto spiegato su Wikipedia a proposito di questo algoritmo.

Come usarlo:

~$ ruby bwt_coder "COCCOMERO"
Input:  |COCCOMERO|
Encode: |OOCMORCCE|
Decode: |COCCOMERO|

Per approfondire:

Codice

  1 #!/usr/bin/ruby
  2
  3 # bwt_coder (v.0.1) a Ruby Burrows-Wheeler transform implementation
  4 # (c)2009 Andrea Ganduglia - www.frequenze.it
  5 # GPL SOFTWARE - Released under GPL3 licenze
  6 #
  7 # usage: ruby bwt_coder.rb "Nel mezzo del cammin di nostra vita"
  8
  9 def bwt_encode(str)
 10     a = []; o = [];
 11     str = "#{str}\000".split(//)
 12     for i in 0..(str.size-1)
 13         a << "#{str.last}#{str[0..(str.size-2)]}".to_s
 14         str = a.last.split(//)
 15     end
 16     a.sort.each do |x|
 17         o << x.split(//).last
 18     end
 19     return o.to_s
 20 end
 21
 22 def bwt_decode(str)
 23     a = []
 24     cols = str.split(//)
 25     for n in 0..(str.size-1)
 26         for i in 0..(str.size-1)
 27             a[i] = "#{cols[i]}#{a[i]}"
 28         end
 29         a = a.sort
 30     end
 31     a.each do |s|
 32         if s.split(//).last == "\000"
 33             return s
 34         end
 35     end
 36 end
 37
 38 f = ARGV[0]
 39 e = bwt_encode(f)
 40 d = bwt_decode(e)
 41
 42 puts "Input:\t|#{f}|"
 43 puts "Encode:\t|#{e}|"
 44 puts "Decode:\t|#{d}|"