Huffman coding: Difference between revisions

Content deleted Content added
Trizen (talk | contribs)
m →‎{{header|Sidef}}: modified code to work with Sidef 2.10
Line 4,961: Line 4,961:
<lang ruby>func walk(n, s, h) {
<lang ruby>func walk(n, s, h) {
n.exists('a') && (
n.exists('a') && (
h[n['a']] = s;
h{n{'a'}} = s;
say "#{n['a']}: #{s}";
say "#{n{'a'}}: #{s}";
return;
return;
);
);
walk(n['0'], s+'0', h);
walk(n{'0'}, s+'0', h);
walk(n['1'], s+'1', h);
walk(n{'1'}, s+'1', h);
}
}


func make_tree(text) {
func make_tree(text) {
var letters = Hash.new;
var letters = Hash.new;
text.each { |c| letters[c] := 0 ++ };
text.each { |c| letters{c} \\= 0 ++ };
var nodes = letters.keys.map { |l|
var nodes = letters.keys.map { |l|
Hash.new('a' => l, 'freq' => letters[l])
Hash.new('a' => l, 'freq' => letters{l})
};
};


var n = Hash.new;
var n = Hash.new;
while (nodes.sort!{|a,b| a['freq'] <=> b['freq'] }.len > 1) {
while (nodes.sort!{|a,b| a{'freq'} <=> b{'freq'} }.len > 1) {
n = Hash.new('0' => nodes.shift, '1' => nodes.shift);
n = Hash.new('0' => nodes.shift, '1' => nodes.shift);
n['freq'] = (n['0']['freq'] + n['1']['freq']);
n{'freq'} = (n{'0'}{'freq'} + n{'1'}{'freq'});
nodes.append(n);
nodes.append(n);
}
}


walk(n, '', n['tree'] = Hash.new);
walk(n, '', n{'tree'} = Hash.new);
return n;
return n;
}
}


func encode(s, t) {
func encode(s, t) {
t = t['tree'];
t = t{'tree'};
s.split(1).join('' => {t[_]});
s.split(1).join('' => {|c| t{c}});
}
}


Line 4,997: Line 4,997:


enc.each {|bit|
enc.each {|bit|
(n = n[bit]).exists('a') && (
n = n{bit};
out += n['a']; n = tree;
n.has_key('a') && (
out += n{'a'}; n = tree;
);
);
};
};