2016-01-24 51 views
0

我需要幫助我的代碼。我正在嘗試接近凱撒密碼問題,並且從我讀過的讀物中我感覺我有點在正確的軌道上。我是編碼方面的新手,所以我仍然有很多東西需要學習,以免寫得太差。我試圖做的是將字符串拆分成一個數組,並檢查該數組的每個元素是否是一個字母。如果是,則該字母將使用來自Charcode()函數的charCodeAt()轉換爲新字母。我設法只用一個字母分開做,但是當它進入循環時就會搞砸了。如果有人給我提示我做錯了什麼,或者即使我朝着正確的方向前進,我也將不勝感激。謝謝!凱撒密碼不理解如何解決

function rot13(str) { 

var splitArr = str.split(''); 
var newArr = [ ]; 

    for (var i = 0; i < str.length; i++){ 
     if (isLetter(splitArr[i]) === true){ 
     newArr = String.fromCharCode(splitArr.charCodeAt(splitArr.length[i]) + 13); 
    } else { 
     newArr.push(splitArr[i]); 
     } 
    } 
     return newArr.join(""); 
} 

function isLetter(str) { 
return str.length === 1 && str.match(/[A-z]/i); //checks if its a letter 
} 


// Change the inputs below to test 
rot13("AB? ..."); 

回答

1

你有正確的想法,但你對細節模糊不清。

首先,charCodeAt適用於字符串,而不是數組,因此您不必首先將字符串拆分爲數組。如方法名稱所示,您要求字符串中給定位置的字符代碼爲,位於

二,splitArr.length[i]沒有任何意義 - 在數組上調用.length會返回一個數字,您不能再轉身和下標;例如​​變成3[i]

第三,當腐爛13時,你必須確保結果保持在字母表中。 A的字符代碼是65,並且根據需要添加13會得到78,這是N - 很好。但N也應該回到A,並添加13到78得到你91,這是一個左括號([)。

通常的做法是減去'A'(或'a',如果是小寫)的字符代碼,加上13,取結果 26(即除以26後的餘數),並將其添加回'A'的字符代碼。

這是一個函數(fiddle),它將rot13一個單字符字符串。你應該可以修改它來做一個任意長度的字符串:

var Acode = "A".charCodeAt(0); 
var Zcode = "Z".charCodeAt(0); 
var aCode = "a".charCodeAt(0); 
var zCode = "z".charCodeAt(0); 

function rot13singleChar(ch) { 
    var code = ch.charCodeAt(0); 
    if (code >= Acode && code <= Zcode) { 
    code = (code - Acode + 13) % 26 + Acode; 
    } else if (code >= aCode && code <= zCode) { 
    code = (code - aCode + 13) % 26 + aCode; 
    } 
    return String.fromCharCode(code); 
} 
+0

非常感謝你,這是完全合理的。我將嘗試並實現代碼,並計算如何將字符串更改爲字母,但特殊字符保持不變。 – riv