JSFiddle - React, Tailwind, and code Playground

HTML

<textarea id="encode" rows="10" cols="50" placeholder="Шифруем"></textarea>

<textarea id="decode" rows="10" cols="50" placeholder="Расшифровываем"></textarea>

JavaScript

const syms = [
  "ПУК",
  "СРЕНЬК",
  "ХРЮК",
  "УИИИ",
  "ЛАХТА",
  "ЛИБЕРАХА",
  "ХОХЛЫ",
  "СВИНОСОБАКА",
  "ШВАЙНОКАРАСЬ",
  "ЛОЛ",
  "КЕК",
  "АБУ",
  "ДВАЧ",
  "ПАРАША",
  "ПОРИДЖ",
  "ХРЮЧЕВО",
  "СВИН",
  "ПЕРДИКС",
  "ПЫНЯ",
  "ЧАЮ",
  "ШУЕ",
  "ЛЕВАК",
  "ПРАВАК",
  "КОМИГЛИСТ",
  "ШВЯТЫЕ",
  "ВАТА",
  "ВОЛОДИН",
  "ДОЛБИЛЬНЯ",
  "ПЕРЕФОРС",
  "КУНЧИК",
  "АВАТАРКА",
  "АНАЛЬЧИК",
];

const keysLen = Math.log2(syms.length);

const symsEncode = () => {
  let result = {};

  syms.forEach((item, index) => {
    result[("0".repeat(keysLen) + index.toString(2)).slice(-keysLen)] = item;
  });

  return result;
};

const symsDecode = () => {
  let result = {};

  Object.entries(symsEncode()).forEach(([key, value]) => {
    result[value] = key;
  });

  return result;
};

const rle = (string) => {
  let arr = string.split("-"),
    encoding = [],
    previous = arr[0],
    count = 1;

  for (let i = 1; i < arr.length; i++) {
    if (arr[i] !== previous) {
      encoding.push(count, previous);
      count = 1;
      previous = arr[i];
    } else {
      count++;
    }
  }

  encoding.push(count, previous);
  return encoding.join("-").replace(/1-/g, "").replace(/(\d)-/g, "$1");
};

const decode = (string) => {
  const data = symsDecode();

  let ba = string
    .split("-")
    .map((item) => {
      const count = /(\d*)(\w+)-?/.exec(item);

      if (count) {
        const key = item.replace(count[0], "");
        return data[key].repeat(parseInt(count[0]));
      }

      return data[item];
    })
    .join("");

  const padLen = ba.length % 8;
  ba = ba.substring(0, ba.length - padLen);

  return new TextDecoder().decode(
    new Uint8Array(ba.match(/.{1,8}/g).map((c) => parseInt(c, 2)))
  );
};

const encode = (string) => {
  let ba = new TextEncoder()
    .encode(string)
    .reduce((s, b) => s + b.toString(2).padStart(8, "0"), "");

  const padLen = keysLen - (ba.length % keysLen);
  ba = ba + "0".repeat(padLen);

  const data = symsEncode();

  return rle(
...