使用javascript解码字符串
我在hacker.org上做了一个挑战,上面写着“我有一段特殊的文本,代表一个特定的值。我是这样计算的: 开始从左到右阅读, 如果一个字符是一个数字,我把它加到总和上, 如果是“x”,我把它移到左边两个地方, 继续,直到我碰到绳子的末端。 例如,字符串“123x456”的值为26 “93752xxx746x27x1754xxxx90x93xxxxx238x4x4x4x75xx08750912738x8461x8759383xx328x4x494353x6x550360535004xxxxxxxx9459961296x267x8842xxx6xx61x48482x80xxx83316843x7x83x9521731x25x51xx457x56x9698222x7712345034x5133592x27xx87xx3522x36x50x50x50x7x87x76x998418xx”的值是多少?” 这是我为解决此任务而编写的代码使用javascript解码字符串,javascript,encryption,decode,encode,Javascript,Encryption,Decode,Encode,我在hacker.org上做了一个挑战,上面写着“我有一段特殊的文本,代表一个特定的值。我是这样计算的: 开始从左到右阅读, 如果一个字符是一个数字,我把它加到总和上, 如果是“x”,我把它移到左边两个地方, 继续,直到我碰到绳子的末端。 例如,字符串“123x456”的值为26 “93752xxx746x27x1754xxxx90x93xxxxx238x4x4x4x75xx08750912738x8461x8759383xx328x4x494353x6x550360535004xxxxxxxx
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'));
函数解密(文本){
var总和=0;
对于(变量i=0;i
当我运行这段代码时,它似乎运行了一个无限循环,这是为什么?.replace()
方法不会改变原始字符串(字符串在js中是不可变的),它只返回带有替换子字符串的新字符串,所以用零替换“X”或“X”看起来应该有点不同:
text = text.replace(text[i], 0);
请注意,这段代码在您的函数中可以正常工作,但它不考虑被替换子字符串的确切位置(它会找到第一个匹配项并替换它)。在其他情况下,您可以考虑使用<代码>子字符串(<)/代码>来替换特定字符:
// 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”
。虽然第一个很好,但第二个的计算结果始终为true,每次到达该语句时,都会将i
向后移动两次-遗憾的是,JS无法猜测您是否试图将“X”强制为布尔值,或者想知道text[i]
是否等于“X”,它只是将每个表达式计算为单个表达式,而“X”被强制转换为true
您可以通过在开始对字符串进行操作之前将其转换为数组来解决字符串不变性的问题(根据的答案)。您的函数可以写成:
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
函数解密(str){
var s=str.split(“”)/=>转换为数组
,i=-1
,总和=0;
而((i+=1)26
if语句总是求值为true,这是一个很好的捕捉。String.prototype.replace
方法不会替换所有出现的情况,只替换第一个。除非在第三个参数中传递一个'g'
,或者使用一个带有g标志的RegExp。因此,text=text.replace(text[i],0)
在这种情况下应该可以使用。@是的,我的错误。无法删除代码示例,所以删除了所有混乱的代码。