3

我的 ROT13 JS 函数在大多数情况下都可以正常工作,但有些字符会出现错误,例如HELLO返回U,R,Y,Y,\.

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

Ps 我正在参加 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"));

4

2 回答 2

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.");
于 2020-09-24T14:30:39.610 回答
0

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

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

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

例子:

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

如果在移动一个字母后超出了字母范围,那么该字母将被包裹在字母表中。示例:字母 Z 移动 3 个位置后变为 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;
}

还有其他实现取模的方法……有兴趣的可以参考这篇文章

通过使用上面定义的 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 进行编码...现在只需选择算法名称所指示的适当密钥即可。

于 2018-06-09T04:24:53.563 回答