我的rot-13(Caesar Decipher)Javascript算法出了什么问题?

时间:2017-02-20 01:36:06

标签: javascript

function rot13(str) { // LBH QVQ VG!
  

 
  
  var array=str.split(" ");
  for(var i=0;i<array.length;i++){

    array[i]=array[i].split('');
  }
  
  
  for(var j=0;j<array.length;j++){
    for(var k=0;k<array[j].length;k++){
      var s=array[k];
      if(s=="!"||s=="?"||s=="."){
        s=s;
       }
      else if(s.charCodeAt(0)==77||s.charCodeAt(0)<77){
        s=String.fromCharCode(s.charCodeAt(0)+13);
      }
      else if(s.charCodeAt(0)>77){
        s=String.fromCharCode(s.charCodeAt(0)-13);
      }
    }
  
  
  for(i=0;i<array.length;i++){
    array[i]=array[i].join("");
  }
  array=array.join(" ");
 
   return array;
  
}
}

// Change the inputs below to test
rot13("IM JOE!");

所以例如,rot13(“SERR YBIR!”)应该给你“自由的爱!”。 错误消息显示“TypeError:s.charCodeAt不是函数”。

什么意思?我该如何解决?

3 个答案:

答案 0 :(得分:1)

var s=arr[k];更改为var s=arr[j][k];

此外,您必须在加入数组之前将结果放入数组中。

&#13;
&#13;
function rot13(str) { // LBH QVQ VG!
  var arr=str.split(" ");
  for(var i=0;i<arr.length;i++){
    arr[i]=arr[i].split('');
  }
  
  for(var j=0;j<arr.length;j++){
    for(var k=0;k<arr[j].length;k++){
      var s=arr[j][k];
      if(s=="!"||s=="?"||s=="."){
        s=s;
       }
       else if(s.charCodeAt(0)<=77){
        s=String.fromCharCode(s.charCodeAt(0)+13);
      } 
      else if(s.charCodeAt(0)>77){
        s=String.fromCharCode(s.charCodeAt(0)-13);
      }
      arr[j][k] = s;
    }
 }
 
  
  for(i=0;i<arr.length;i++){
    arr[i]=arr[i].join("");
  }
  arr=arr.join(" ");
 
   return arr;
  
}

// Change the inputs below to test
alert(rot13("IM JOE!"));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您需要使用array[j][k]

来处理字符

您还需要更改数组,更改s不执行任何操作

你错放了}

您应该查看<=

function rot13(str) { // LBH QVQ VG!
    var array = str.split(" ");
    for (var i = 0; i < array.length; i++) {
        array[i] = array[i].split('');
    }
    for (var j = 0; j < array.length; j++) {
        for (var k = 0; k < array[j].length; k++) {
            var s = array[j][k].charCodeAt(0);
            if (s >= 65 && s <= 77) {
                array[j][k] = String.fromCharCode(s.charCodeAt(0) + 13);
            } else if (s >= 78 && s <= 90) {
                array[j][k] = String.fromCharCode(s.charCodeAt(0) - 13);
            }
        }
    // this } was below the return statement, so only the first word would've been transformed
    }
    for (i = 0; i < array.length; i++) {
        array[i] = array[i].join("");
    }
    array = array.join(" ");
    return array;
}
// Change the inputs below to test
console.log(rot13("IM JOE!"));
console.log(rot13("LBH QVQ VG!"));

答案 2 :(得分:1)

检查你的逻辑 return语句和数组访问的位置是错误的。

function rot13(str) { 
  var array=str.split(" ");  
  for(var j=0;j<array.length;j++){  
    array[j]=array[j].split('');
    for(var k=0;k<array[j].length;k++){
      var s=array[j][k];
      if(s=="!"||s=="?"||s=="."){
        s=s;
      }
      else if(s.charCodeAt(0)==77||s.charCodeAt(0)<77){
        s=String.fromCharCode(s.charCodeAt(0)+13);
      }
      else if(s.charCodeAt(0)>77){
        s=String.fromCharCode(s.charCodeAt(0)-13);
      }
      array[j][k]=s;
    }
    array[j]=array[j].join("");
  }
  array=array.join(" ");
  return array;
}
// Change the inputs below to test
alert(rot13("SERR YBIR!"));