L'ho trovato, funziona solo sui numeri (una conversione da stringa a numero potrebbe avvenire all'esterno se necessario).
Converte il numero in binario e quindi esegue il mapping di lettere minuscole che sono dispari (a, c, e, ...) o pari (b, d, f, ...) rispettivamente a 0 o a 1. Quindi
74 = 1001010 = "baababa"
74 = 1001010 = "pcgtghy"
74 = 01001010 = "etcetera"
Questo è il codice in Javascript
const a = 'a'.charCodeAt(0);
const length = 'z'.charCodeAt(0) - a;
function padLeft (string, len){
while(string.length < len) { string = 0 + string; }
return string;
}
function decode (val) {
return (val.charCodeAt(0) - a) % 2;
}
function encode (odd) {
// generate a random letter in the available range
// but make sure it's odd or even
return String.fromCharCode(a + Math.floor(length * Math.random() / 2) * 2 + parseInt(odd, 10));
}
function generate (number, minLength = 0) {
return padLeft(number.toString(2), minLength).split('').map(encode).join('');
}
function solve (code) {
return parseInt(code.split('').map(decode).join(''), 2);
}
E questo è l'utilizzo, accetta anche un parametro di lunghezza minima
code = generate(74); console.log(code, solve(code));
code = generate(74, 5); console.log(code, solve(code));
code = generate(74, 10); console.log(code, solve(code));
code = generate(74, 20); console.log(code, solve(code));
Anche su npm