У меня есть очень длинные целочисленные последовательности, которые выглядят так (произвольная длина!):
0000000001110002220033333
Теперь мне нужен алгоритм для преобразования этой строки во что-то сжатое, как
a9b3a3c3a2d5
Что означает «a 9 раз, затем b 3 раза, затем a 3 раза» и так далее, где «a» обозначает 0, «b» обозначает 1, «c» обозначает 2 и «d» обозначает 3.
Как бы вы это сделали?
Пока что мне не пришло ничего подходящего, и мне не повезло с Google, потому что я не знал, что искать. Как называется этот вид кодирования / сжатия?
PS: я собираюсь сделать кодировку с PHP и декодирование в JavaScript .
Редактировать : Спасибо всем!
Я получил эту функцию для кодирования:
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;
}
А что для декодирования:
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');
};