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;
  }
 ...