[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Late huffman (quiz 123

Kyle Schmitt

5/16/2007 10:50:00 PM

So it's rather late to post this, but I spent the time writing it, so why not?
I was hoping I could get a few pointers also, on making this well..
more ruby like.

Perhaps more efficient, more right, etc.

#huffman encoding by dummies
class Huffman
def initialize(string)
@sourcestring=string
@translationtable=nil
@encoded=nil
@prettyencoded=nil
@decoded=nil
end
attr_accessor :sourcestring
attr_reader :encoded,:translationtable,:decoded,:prettyencoded
def maketranslationtable()
@translationtable=Hash.new(0)
@sourcestring.split('').each{|l|
@translationtable.store(l,@translationtable[l]+1)}
count=0
@translationtable.collect{|a| a[0],a[1]=a[1],a[0]}.sort.reverse.each do
|letter|
@translationtable.store(letter[1],("1"*count+"0").to_i)
count+=1
end
@translationtable[@translationtable.invert.max[1]]/=10
end

def translationtable=(newtranslationtable)
@translationtable=newtranslationtable if
newtranslationtable.class==@translationtable.class
puts "with a new translationtable, prettymuch everything needs clearing"
@sourcestring=nil
@encoded=nil
@prettyencoded=nil
@decoded=nil
end

def encoded=(data)
@encoded=data
puts "with new encoded data, many thigns need to be cleared"
@sourcestring=nil
@prettyencoded=nil
@decoded=nil
end

def encode()
maketranslationtable() if @translationtable.nil?
@encoded=@sourcestring.split('').collect{|i| @translationtable[i]}.join
end
def decode()
if @translationtable.nil? then
puts "Can't decode without a translation table!"
else
@decoded=@encoded.clone
@translationtable.invert.to_a.sort.reverse.each do
|pair|
@decoded.gsub!(pair[0].to_s,pair[1])
end
end
end

def prettyprint(byte=8,bytes=5)
encode() if @encoded.nil?
@prettyencoded=""
@encoded.gsub(/([01]{#{byte}})/){|i| "#{i} "}.split.each_with_index do
|num,index|
@prettyencoded+="#{num}#{(index+1)%bytes==0?"\n":' '}"
end
@prettyencoded+="\n"
end

def to_s()
prettyprint() if @prettyencoded.nil?
decode() if @decoded.nil?
"#{@decoded}\n#{@prettyencoded}"
end

private :prettyprint
end


h=Huffman.new(ARGV.join(' '))
puts h