Javascript ROT13功能仅部分工作

时间:2017-04-03 09:29:47

标签: javascript caesar-cipher rot13

我的ROT13 JS功能大部分工作正常,但有些字符出错了,例如HELLO返回U,R,Y,Y,\

有人可以向我解释我做错了吗?

P.s我正在进行freeCodeCamp Caesars Cipher Challenge。



function rot13(str) { // LBH QVQ VG!
  var stringArray = str.split("");
  var stringArray2 = [];
  var stringArray3 = [];
  for( var i in stringArray){
    var y = stringArray[i].charCodeAt();
    y += 13;
    stringArray2.push(y);
  }
  for (var u in stringArray2){
    var x = String.fromCharCode(stringArray2[u]);
    stringArray3.push(x);
  }
  var transformed = stringArray3.join().toString();
  return transformed;
}

// Change the inputs below to test
console.log(rot13("HELLO"));




2 个答案:

答案 0 :(得分:0)

我想为您提供ROT13功能的替代方案。

我提议的替代方案只是常规凯撒密码算法的一种特殊用法 - 一种非常简单的加密形式,其中原始消息中的每个字母向左或向右移动一定数量的位置

要解密消息,我们只需将字母移回相同数量的位置。

示例:

  • 如果我们将所有字母移动3个位置
  • ,则JAVASCRIPT变为MDYDVFULSW
  • 如果我们将所有字母移回3个位置,MDYDVFULSW将返回JAVASCRIPT。

如果在移动字母超出字母范围后,则字母会以字母顺序包裹。示例:如果移位3个位置,则字母Z变为C.

这种“环绕”效果意味着使用模数。在数学术语中,上述内容可以表示为:

En(x)=(x + n)mod 26

Dn(x)=(x - n)mod 26

尝试在JavaScript中实现此算法而不使用正确的模运算符将产生不正确的结果或非常神秘且难以理解的代码。

最大的问题是JavaScript不包含模运算符。 %运算符只是对除法的提醒 - 不是模数。但是,将模数作为自定义函数实现非常容易:

// Implement modulo by replacing the negative operand 
// with an equivalent positive operand that has the same wrap-around effect
function mod(n, p)
{
    if ( n < 0 )
        n = p - Math.abs(n) % p;

    return n % p;
}

还有其他实现模数的方法......如果您有兴趣,可以查阅article

通过使用上面定义的mod函数,代码表示相同的数学方程:

// Function will implement Caesar Cipher to
// encrypt / decrypt the msg by shifting the letters
// of the message acording to the key
function encrypt(msg, key)
{
    var encMsg = "";

    for(var i = 0; i < msg.length; i++)
    {
        var code = msg.charCodeAt(i);

        // Encrypt only letters in 'A' ... 'Z' interval
        if (code >= 65 && code <= 65 + 26 - 1)
        {
            code -= 65;
            code = mod(code + key, 26);
            code += 65;
        }

        encMsg += String.fromCharCode(code);
    }

    return encMsg;
}

使用ROT13进行编码...现在只需选择算法名称所示的相应密钥即可。

答案 1 :(得分:0)

function rot13(str) {
  str = str.split("");
  function a(item){
    let result;
    if (item.charCodeAt()>=65&&item.charCodeAt()<78){
      result= String.fromCharCode(item.charCodeAt()+13); 
    }
    else if(item.charCodeAt()>=78&&item.charCodeAt()<=95){
      result= String.fromCharCode(item.charCodeAt()-13);
    }
    else{
      result = item;
    }
    return result;
  }
  str = str.map(item=>a(item)).join("");
  console.log(str);
  return str;
}

rot13("GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.");