Tamsayılar tekrarı Encode / sıkıştırmak dizisi

4 Cevap php

Ben böyle (! Keyfi uzunluğu) bakmak çok uzun tamsayı dizileri var:

0000000001110002220033333

Şimdi gibi sıkıştırılmış bir şey içine bu dizeyi dönüştürmek için bazı algoritma gerekir

a9b3a3c3a2d5

Böylece ve, "daha sonra 3 kez, daha sonra 3 kez b, 9 kez" anlamına gelir burada "a" için 2, "c" ve 3 için, "d", 1 için, 0 için "b" duruyor.

How would you do that? So far nothing suitable came to my mind, and I had no luck with google because I didn't really know what to search for. What is this kind of encoding / compression called?

PS: Ben PHP ile kodlama yapmak için gidiyorum, ve JavaScript olarak çözme.

Edit: Hepinize teşekkür ederim!

Ben kodlama için bu fonksiyonu ile sona erdi:

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;            
}

Ve çözmesi için bu:

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');     
};

4 Cevap

Bu {[(0)] olarak adlandırılır}

PHP Temel kodlayıcı:

function numStringToRle($s){
    $rle = '';
    $count = 1;
    $len = strlen($s);
    for ( $i = 0; $i < $len; $i++ ){
        if ( $i != $len && $s[$i] == $s[$i+1] ){
            $count++;                
        }else{
          $rle .= chr($s[$i] + 97).$count;    
          $count = 1;
        }
    }
    return $rle;
}

Sanki bir dize ile kötü sorunlar preform olacak uyardı

 123456789123456789

Eğer tek tek karakterleri bir sürü olabilir bir dize işleme gittiğini eğer bazı karmaşık eklemek için daha iyi olurdu ve çalışma uzunluğu 1 ise çalıştırmak uzunluğunu yazmak değil.

//change
$rle .= chr($s[$i] + 97).$count;    

//to
$rle .= chr($s[$i] + 97).( $count == 1 ? '' : $count );   

//or
$rle .= chr($s[$i] + 97)
if ( $count != 1 ){
    $rle .= $count;
}

Burada kısa bir versiyonu:

function smush(str) {
  return str.replace(/((.)\2*)/g, function(_, w, x) {
    return x + w.length;
  });
}

edit oh ben php ile kodlamak istiyorum görmek; üzgünüm ben bilmiyorum. İşte benzer bir ruhu içinde bir dekoder var:

function unsmush(str) {
  return str.replace(/(.)(\d+)/g, function(_, x, n) {
    return new Array(parseInt(n, 10) + 1).join(x);
  });
}

Burada ne istediğinizi naif bir uygulamasıdır.

$toEncode = '0000000001110002220033333';
$currentChar = '-1';
$length = strlen($toEncode);
$encoded = '';
$currentNbrChar = 0;
for($i = 0; $i < $length; $i++){
  if($toEncode[$i] != $currentChar){
    if($currentChar != '-1'){
      $encoded .= chr(97 + $currentChar).$currentNbrChar;
    }
    $currentNbrChar = 0;
    $currentChar = $toEncode[$i];
  }
  $currentNbrChar ++;
}
if($currentChar != '-1'){
  $encoded .= chr(97 + $currentChar).$currentNbrChar;
}
echo $encoded;

Bilginize, muhtemelen verilerinizi gziplemek olabilir ve göz otomatik olarak ayıklayın. Çoğu uygulamaları için bu RLE daha iyi çalışmaya devam ediyor. Ama belli ki daha eğlenceli.