2017-02-20 37 views
0

我的rot-13(Caesar Decipher)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!”)应该给你 “免费LOVE!”。 错误消息显示“TypeError:s.charCodeAt不是函数”。

是什么意思?我应该如何解决它?

+2

也许你想'变种S =阵列[J] [K];' –

+0

什么,当你尝试做'charCodeAt()'的s'的'价值? –

+0

Jaromanda我做到了。现在,该函数返回IM JOE!没有变化 – user132522

回答

1

变化var s=arr[k];var s=arr[j][k];

而且,你必须把结果数组中加入他们。

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!"));

+0

仍然不会工作,因为至少有两个其他错误 –

+0

@JaromandaX。没有错误。但是,逻辑错了。我修好了它。 – Mojtaba

+0

错误,我的意思是错误的逻辑(其中两个,右) –

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!")); 
+0

谢谢你的改进。使它更加精确。 – user132522

1

检查您的逻辑。
返回语句和数组访问的位置是错误的。

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!"));