今天要解的題目是凱薩密碼,凱薩密碼也稱為凱撒加密,它會將一串明文的所有字母順序經過一定數字的偏移後轉為密文。
例如有一串字母 ABCD,分別是英文26個字母中的第1, 2, 3, 4個字母,經過數字3的偏移後,變成 DEFG 的一串密文,分別是英文26個字母中的第4, 5, 6, 7個字母。
可以參考維基百科的凱薩加密:
https://zh.wikipedia.org/wiki/%E5%87%B1%E6%92%92%E5%AF%86%E7%A2%BC
因此這次的問題就是輸入一個字串明文和要偏移的數字,最後回傳加密後的字串密文。
理解題目後我們就來實作吧!
function caesarCipher(str, num) {
let newString = '';
num %= 26;
for (let i = 0; i < str.length; i++) {
}
}
接著我們會用到一個語法 charCodeAt(index)
,它可以將字母轉為 ASCII Code,然後我們根據這個 ASCII Code 判斷字母是否為大小寫並進行偏移。偏移之後我們再將數字用 String.fromCharCode(num)
轉為字母。
String.fromCharCode(num)
裡面的一連串運算是使大小寫字母經過偏移後都還能在合理的 ASCII Code 範圍內。
function caesarCipher(str, num) {
let newString = '';
// num %= 26;
for (let i = 0; i < str.length; i++) {
let c = str.charCodeAt(i);
// 大寫
if (c >= 65 && c <= 90) {
newString += String.fromCharCode((c - 65 + num) % 26 + 65);
} else if (c >= 97 && c <= 122) { // 小寫
newString += String.fromCharCode((c - 97 + num) % 26 + 97);
} else { // 非字母就直接加到輸出的密文
newString += str.charAt(i);
}
}
return newString;
}
最後我們來執行完成的程式吧!
console.log(caesarCipher("Hello World!", 12));
印出結果如下:
這次的程式碼在以下連結:
https://github.com/a90100/javascript-data-structure/blob/master/day27-caesar-cipher.js
明天我們將來實作"Ransom Note"的問題!