JSFiddle - React, Tailwind, and code Playground
Entire Source Dictionary Compression Test
by skibulk
JavaScript
var data = "";
var out = [];
var final = "";
for (var i = 0; i < 800; i++) {
data += Math.round(Math.random());
}
console.clear();
console.log(data.length, data);
parse(data, out);
out.sort(function(a, b) {
return a.i - b.i
});
console.log(out);
var total = 0;
var codes = -1;
for (var i = 0; i < out.length; i++) {
total += out[i].val.length;
if (dictIndexOf(out, out[i].val) == i) {
final += "AAAA" + out[i].val;
if(out[i].val.length >= 4) codes++;
} else {
final += "A" + codes.toString(2);
}
}
console.log(total, codes);
console.log(final.length, final);
console.log(final.replace(/A/g, ""));
function parse(data, out) {
var str, count;
var dict = [];
if (data.length < 8) return data;
// String Lengths
for (var i = 4; i < 8; i++) {
// Data position
for (var j = 0; j < data.length - i; j++) {
str = data.substring(j, j + i);
if (str.indexOf(" ") >= 0) continue;
if (dictIndexOf(dict, str) < 0) {
count = countInstances(data, str);
weight = (str.length - 3) * count;
if (count > 1) dict.push({
val: str,
count: count,
weight: weight
});
}
}
}
if (dict.length) {
dict.sort(function(a, b) {
return b.weight - a.weight
});
str = dict[0].val;
i = data.indexOf(str);
while (i >= 0) {
out.push({
i: i,
val: str
});
data = data.replace(str, " ".repeat(str.length));
i = data.indexOf(str);
}
data = data.replace(new RegExp(str, "gm"), " ".repeat(str.length));
return parse(data, out);
} else {
var matches = data.matchAll(/\S+/g);
for (var match of matches) {
out.push({
i: match.index,
val: match[0]
});
}
}
return data;
}
function countInstances(str, sub) {
return str.split(sub).length - 1;
}
function dictIndexOf(dict, val) {
for (var i = 0; i < dict.length; i++) {
if (dict[i].val == val) return i;
}
...