Huffman coding: Difference between revisions

m
→‎{{header|Sidef}}: modified code to work with Sidef 2.10
m (→‎{{header|Sidef}}: modified code to work with Sidef 2.10)
Line 4,961:
<lang ruby>func walk(n, s, h) {
n.exists('a') && (
h[{n[{'a']]}} = s;
say "#{n[{'a']}}: #{s}";
return;
);
walk(n[{'0']}, s+'0', h);
walk(n[{'1']}, s+'1', h);
}
 
func make_tree(text) {
var letters = Hash.new;
text.each { |c| letters[{c]} :\\= 0 ++ };
var nodes = letters.keys.map { |l|
Hash.new('a' => l, 'freq' => letters[{l]})
};
 
var n = Hash.new;
while (nodes.sort!{|a,b| a[{'freq']} <=> b[{'freq']} }.len > 1) {
n = Hash.new('0' => nodes.shift, '1' => nodes.shift);
n[{'freq']} = (n[{'0'][}{'freq']} + n[{'1'][}{'freq']});
nodes.append(n);
}
 
walk(n, '', n[{'tree']} = Hash.new);
return n;
}
 
func encode(s, t) {
t = t[{'tree']};
s.split(1).join('' => {|c| t[_]{c}});
}
 
Line 4,997:
 
enc.each {|bit|
(n = n[{bit]).exists('a') && (};
out += n[.has_key('a']; n) =&& tree;(
out += n{'a'}; n = tree;
);
};
2,747

edits