31 lines
721 B
Plaintext
31 lines
721 B
Plaintext
/* Shannon entropy, in Jsish */
|
|
|
|
function values(obj:object):array {
|
|
var vals = [];
|
|
for (var key in obj) vals.push(obj[key]);
|
|
return vals;
|
|
}
|
|
|
|
function entropy(s) {
|
|
var split = s.split('');
|
|
var counter = {};
|
|
split.forEach(function(ch) {
|
|
if (!counter[ch]) counter[ch] = 1;
|
|
else counter[ch]++;
|
|
});
|
|
|
|
var lengthf = s.length * 1.0;
|
|
var counts = values(counter);
|
|
return -1 * counts.map(function(count) {
|
|
return count / lengthf * (Math.log(count / lengthf) / Math.log(2));
|
|
})
|
|
.reduce(function(a, b) { return a + b; }
|
|
);
|
|
};
|
|
|
|
if (Interp.conf('unitTest')) {
|
|
; entropy('1223334444');
|
|
; entropy('Rosetta Code');
|
|
; entropy('password');
|
|
}
|