2017-02-25 1 views
0

Pour ma tâche, j'écris le code pour compresser puis décompresser une chaîne via la compression sans perte en javascript.

Pour exemple-
Chaîne d'origine: heeeeelllllloo
comprimé: h1e5l6o2
décompressé: heeeeellllllooCodage de longueur de compression sans perte dans javascript

Ce code apparaît comme une boucle infinie, et le problème est quelque part dans la fonction de compression. S'il vous plaît aidez-moi à trouver/résoudre le problème!
C'est ce que j'ai jusqu'à présent:

// Read in the original text 
var textToCompress = prompt("Enter the text you would like to compress: "); 
runLengthEncoding(textToCompress); 

function runLengthEncoding(originalText){ 
console.log("Original Text: " + originalText); 
console.log(""); 

// Compress the text 
console.log("COMPRESSING..."); 

var compressedText = compress(originalText); 
console.log("Compressed: " + compressedText); 
console.log(""); 

//Decompress the text 
console.log("DECOMPRESSING..."); 

//var decompressedText = decompress(compressedText); 
console.log("Decompressed: " + decompressedText); 
console.log(""); 

// Make sure the compression was lossless 
if(originalText == decompressedText) 
{ 
    console.log("Success! The decompressed text is the same as the original!"); 
} 
} 

// Compresses the original String by building up a new String 
// with each character and how many times it repeats in a given run. 
// Returns the compressed text. 
function compress(original){ 
    var result = ""; 
    //Write your code here 
    for (var i = 1; i < original.length; i++){//look at each character in string 
    var sum = 1; 
    var currentChar = original.charAt(i); 
    //if currentchar is the first character 
    if (currentChar == original.charAt(0)){//isolate frist character of the string 
     result = currentChar;//add the currentchar to result 
     console.log(result); 
    //if currentchar is not the first character 
    } else if (currentChar !== original.charAt(0)) { 
     //if currentchar is equal to the previous character 
     if (currentChar == original.charAt(i-1)){ 
     sum++; 
    } else { 
     result += sum;//add sum ot the result and reset sum to 1 
     sum = 1; 
     i = 0; 
     } 

} 
} 
} 

// Decompresses the compressed Run Length Encoded text back 
// into the original form. 
function decompress(compressedText) 
{ 
var result = ""; 

for(var i = 0; i < compressedText.length; i += 2) 
{ 
    // Get the current run character 
    var character = compressedText.charAt(i); 

    // Get the run length 
    var runLength = parseInt(compressedText.charAt(i+1)); 

    // Add that many repetitions of the original character to the result 
    for(var runIndex = 0; runIndex < runLength; runIndex++) 
    { 
     result += character; 
    } 
} 

return result; 
} 
+1

Ok, et votre question est? –

+0

Ce n'est pas une compression, c'est dans la plupart des cas une inflation. Cette première phrase serait codée comme suit: 'T1h1i1s1 1i1s1 1n1o1t1 a1 1c1o1m1p1r1e1s2i1o1n1,1 1t1h1i1s1 1i1s1 1i1n1 1m1o1s1t1 1c1a1s1e1s1 1a1n1 1i1n1f1l1a1t1i1o1n1.1 'Est-ce vraiment ce que vous voulez? – Psi

Répondre

0

Tout d'abord, ne compare pas les caractères pour savoir si ce caractère est le premier, parce que cela reviendrait vrai si le premier caractère est répété dans le texte. La dernière chose que j'ai vue, c'est que vous mettez l'indice i à 0 chaque fois que vous trouvez un nouveau caractère qui amène votre fonction à recommencer au début de la chaîne et se terminera par un blocage.

C'est au moins ce que je pense, et j'espère pouvoir vous aider