mam bardzo długie sekwencje liczb całkowitych, który wyglądał następująco (dowolnej długości!):Kodowanie/kompresji sekwencji powtarzających się liczb całkowitych
0000000001110002220033333
Teraz muszę trochę algorytm przekonwertować ten ciąg do czegoś sprężonego jak
a9b3a3c3a2d5
Co oznacza "9 razy, potem b 3 razy, potem 3 razy" i tak dalej, gdzie "a" oznacza 0, "b" dla 1, "c" dla 2 i "d" dla 3.
Jak byś to zrobił? Jak dotąd nic mi nie przychodziło do głowy i nie miałem szczęścia w Google, ponieważ tak naprawdę nie wiedziałem, czego szukać. Jak nazywa się ten rodzaj kodowania/kompresji?
PS: Mam zamiar zrobić kodowanie z PHP i dekodowania w JavaScript.
Edytuj: Dziękuję wszystkim!
skończyło się z tą funkcją kodowania:
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;
}
I do dekodowania:
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');
};
Co dokładnie używasz to wszystko? Czy na pewno nie możesz po prostu skompresować go za pomocą Gzip? http: // stackoverflow.com/questions/294297/javascript-implementation-of-gzip To będzie bardziej efektywny czas i przestrzeń, a to już zrobione. – ryeguy
gzip nie jest opcją, ponieważ muszę ją odkodować za pomocą javascript. Używam go jako rodzaju maski bitowej do gry 2d. – Alex