1. 程式人生 > >Caesars Cipher(算法)

Caesars Cipher(算法)

tor char string pre glob com 升序 abc urn

題目

讓上帝的歸上帝,凱撒的歸凱撒。

下面我們來介紹風靡全球的凱撒密碼Caesar cipher,又叫移位密碼。

移位密碼也就是密碼中的字母會按照指定的數量來做移位。

一個常見的案例就是ROT13密碼,字母會移位13個位置。由‘A‘ ? ‘N‘, ‘B‘ ? ‘O‘,以此類推。

寫一個ROT13函數,實現輸入加密字符串,輸出解密字符串。

所有的字母都是大寫,不要轉化任何非字母形式的字符(例如:空格,標點符號),遇到這些特殊字符,跳過它們。

提示

String.charCodeAt()

String.fromCharCode()

思路

本題的核心在於提示裏給出的兩個方法,我們來分別了解一下。

String.prototype.charCodeAt()

語法:

str.charCodeAt(index)

示例:

"ABC".charCodeAt(0) // returns 65

上例返回 65,即 A 的 Unicode 值。

String.fromCharCode()

語法:

String.fromCharCode(num1, ..., numN)

該方法返回一個字符串,而不是一個 String 對象。

由於 fromCharCode 是 String 的靜態方法,所以應該像這樣使用:String.fromCharCode(),而不是作為你創建的 String 對象的方法。

示例:

String.fromCharCode(65,66,67) // returns "ABC"

好了,回到題目。傳入的字符串都是大寫,而大寫字母 A 到 Z 的 Unicode 值是升序排列的。加密算法的核心是前13個字母 Unicode 值加13,後13個字母 Unicode 值減13從字母表重新回滾。而其他大寫字母以外的空白符符號等等字符原樣不變。

解法

function rot13(str) { // LBH QVQ VG!
  var index = null;
  var temp = "";
  var _A = "A".charCodeAt(0);
  var _Z = "Z".charCodeAt(0);
  var mid = (_A + _Z)/2;
  for(var i = 0; i < str.length; i++){
    index = str.charCodeAt(i);
    if(index >= _A && index <= mid ){
      temp += String.fromCharCode(index + 13);
    }else if(index <= _Z && index > mid ){
      temp += String.fromCharCode(index - 13);
    }else{
      temp += String.fromCharCode(index);
    }   
  }
  return temp;
}

測試

rot13("SERR PBQR PNZC") 應該解碼為 "FREE CODE CAMP" rot13("SERR CVMMN!")應該解碼為 "FREE PIZZA!" rot13("SERR YBIR?") 應該解碼為 "FREE LOVE?" rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.") 應該解碼為 "THE QUICK BROWN DOG JUMPED OVER THE LAZY FOX."

Caesars Cipher(算法)