使用javascript解码字符串

时间:2014-04-20 04:46:09

标签: javascript encryption decode encode

我正在hacker.org上做一个挑战,这就是它所说的"我有一段代表特定价值的特殊文本。以下是我如何计算它: 从左到右开始阅读, 如果一个字符是一个数字,我把它加到我的总和, 如果它是' x,我将其删除并离开两个地方, 继续,直到我到达字符串的末尾。 例如,字符串! 123x456'的值为26。

什么是的值' 93752xxx746x27x1754xx90x93xxxxx238x44x75xx08750912738x8461x8759383xx328x4x4935903x6x5550360535004x0xx945958961296x267x8842xxx5x6xx61x4x48482x80xxx83316843x7x4x83x9521731xxx25x51xx457x6x5x9698222x771237745034x5133592x27xx8x87xx35221x36x0x50x23x7x63x998418xx'"

这是我为解决此任务而编写的代码

    function decrypt(text){
        var sum = 0; 
        for(var i = 0; i < text.length ; i++){
            if(isNaN(parseInt(text[i])) == false){
                sum += parseInt(text[i]);
            }
            else if(text[i] == "x" || "X"){
                text.replace(text[i],0);
                i = i - 2;

            }
        }
        return sum;
    }
document.write(decrypt('93752xxx746x27x1754xx90x93xxxxx238x44x75xx08750912738x8461x8759383xx328x4x4935903x6x5550360535004x0xx945958961296x267x8842xxx5x6xx61x4x48482x80xxx83316843x7x4x83x9521731xxx25x51xx457x6x5x9698222x771237745034x5133592x27xx8x87xx35221x36x0x50x23x7x63x998418xx'));

当我运行此代码时,它似乎运行一个无限循环,为什么会这样?

2 个答案:

答案 0 :(得分:1)

.replace()方法不会改变原始字符串(字符串在js中是不可变的),它只返回带有替换子字符串的新字符串,因此替换&#39; X&#39;或者&#39; x&#39;零应该看起来有点不同:

text = text.replace(text[i], 0);

请注意,此代码在您的函数中可以正常工作,但它并不考虑替换子字符串的确切位置(它首先发现并替换它)。在其他情况下,您可以考虑使用.substr()替换特定字符,如下所示:

// concatenating part before character, '0' and part after character
text = text.substr(0, i) + '0' + text.substr(i + 1);

上面没有提到的另一个问题:

else if(text[i] == "x" || "X")

if结构中有两个语句:text[i] == "x""X"。虽然第一个完全正常,但第二个将始终评估为真,每次达到此声明时将i向后移动两个 - 遗憾的是,JS无法猜测您是否& #39;试图强迫&#34; X&#34;要布尔或想要知道text[i]是否等于&#34; X&#34;,它只是将每个表达式评估为单个表达式,并且&#34; X&#34;被转换为true

答案 1 :(得分:0)

您可以在开始对其进行操作之前将其转换为数组,从而解决字符串不变性问题(根据Fike的答案)。您的功能可以写成:

function decrypt(str){
    var s = str.split('') //=> convert to Array
       ,i = -1
       ,sum = 0;
    while ((i+=1)<s.length){
        sum += +s[i] || 0;
        if (/[xX]/.test(s[i])) {
            s[i] = 0;
            i -= 3;
        }
    }
    return sum;
}
// decrypt('123x456') => 26