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(
...