2017-02-20 33 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!"));