ho molto lunghe sequenze di interi che assomigliano a questo (lunghezza arbitraria!):Encode/comprimere sequenza di interi ripetizione
0000000001110002220033333
Ora ho bisogno di qualche algoritmo per convertire questa stringa in qualcosa compressa come
a9b3a3c3a2d5
Che significa "a 9 volte, poi b 3 volte, poi a 3 volte" e così via, dove "a" sta per 0, "b" per 1, "c" per 2 e "d" per 3.
Come lo faresti? Finora non mi è venuto in mente nulla di adatto, e non ho avuto fortuna con Google perché non sapevo davvero cosa cercare. Come si chiama questo tipo di codifica/compressione?
PS: Sto andando a fare la codifica con PHP, e la decodifica in JavaScript.
Modifica: Grazie a tutti!
Ho finito con questa funzione per la codifica:
protected function numStringToRle($s){
$rle = '';
$count = 1;
$len = strlen($s);
for($i = 0; $i < $len; $i++){
if($i != $len && isset($s[$i+1]) && $s[$i] == $s[$i+1]){
$count++;
} else {
$rle .= chr($s[$i] + 97).($count == 1 ? '' : $count);
$count = 1;
}
}
return $rle;
}
E che per la decodifica:
var decodeCoords = function(str) {
str = str.replace(/(.)(\d+)/g, function(_, x, n) {
return new Array(parseInt(n, 10) + 1).join(x);
});
return str.
replace(/a/g, '0').
replace(/b/g, '1').
replace(/c/g, '2').
replace(/d/g, '3');
};
cosa esattamente stai usando questo per? Sei sicuro di non poterlo comprimere usando Gzip? http: // StackOverflow.it/questions/294297/javascript-implementation-of-gzip Sarà più efficiente in termini di tempo e spazio, ed è già fatto per te. – ryeguy
gzip non è un'opzione perché ho bisogno di decodificarlo con javascript. Lo sto usando come una sorta di maschera di bit per un gioco 2D. – Alex