Caesars Cipher(算法)

题目

让上帝的归上帝,凯撒的归凯撒。

下面我们来介绍风靡全球的凯撒密码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."

 

时间: 2024-10-18 22:30:45

Caesars Cipher(算法)的相关文章

Caesars Cipher

让上帝的归上帝,凯撒的归凯撒. 下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码. 移位密码也就是密码中的字母会按照指定的数量来做移位. 一个常见的案例就是ROT13密码,字母会移位13个位置.由'A' ? 'N', 'B' ? 'O',以此类推. 写一个ROT13函数,实现输入加密字符串,输出解密字符串. 所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们. 这是一些对你有帮助的资源: String.charCodeAt

fcc 基础算法题

fcc 基础算法题 fcc Reverse a String 翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. function reverseString(str) { var arr =str.split(""); //string.split("");以""分割字符串 并返回新的数组 不改变原字符串 arr.reverse(); //反转数组 返回数组的引用 改变原数组 arr = ar

Freecodecamp 前端初级算法(个人向)

freecodecamp 初级算法地址戳这里 Reverse a String 翻转字符串 1 function reverseString(str) { 2 str=str.split("").reverse().join(""); 3 return str; 4 } 5 6 reverseString("hello") Factorialize a Number 计算一个整数的阶乘 1 function factorialize(num) {

js中字符和数组一些基本算法题

最近在刷 fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的.今天抽时间把 Basic Algorithm Scritping  这部分题做了,根据一些提示,还是比较简单的.有些题的处理方式 方法,我想值得借鉴.比如在项目中有时候要处理一个字符,如果想不到一些相关的方法,还挺费事的,所以,在此记录下来,如果以后遇到一些字符或者数组处理,可以来翻翻这篇文章,希望以此得到一些提示而不是去翻文档.   看到此博文的博友,有更好更简单的代码或者好的想法,请留言交流(我一直觉得只有学习别人的优秀代码才

Linux Kernel(Android) 加密算法总结(cipher、compress、digest)

1. Linux内核支持哪些加密算法 ? 内核支持的加密算法很多,包括: 对称加密算法,如AES: 摘要算法,如sha1,md5: 压缩算法,如deflate. 不过内核好像不支持非对称加密算法. 2. 加密算法源文件位置 这些算法作为加密函数框架的最底层,提供加密和解密的实际操作.这些函数可以在内核crypto文件夹下,相应的文件中找到. 3.  配置编译选项将加密算法作为模块编入内核 Cryptographic options 加密选项 Cryptographic API 提供核心的加密AP

fcc初级算法题

  1.Reverse a String 翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 function reverseString(str) { str = str.split(''); str.reverse(); str = str.join(''); return str; } reverseString("hello"); 2.Factorialize a Number 计算一个整数的阶乘

密码学之DES/AES算法

DES DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来. DES使用简介 使用DES需要设置加密内容.加密key.加密混淆向量iv.分组密码模式.填充模式. 加密内容:给定的加密的数据.如果数据长度不是 n*分组大小,则在其后使用 '\0' 补齐. 加密Key:加密密钥. 如果密钥长度不是该算法所能够支持的

FreeCodeCamp初级算法部分学习

Reverse a String 翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 当你完成不了挑战的时候,记得开大招'Read-Search-Ask'. 这是一些对你有帮助的资源: Global String Object String.split() Array.reverse() Array.join() 1 function reverseString(str) { 2 // 请把你的代码写在这里 3 va

Vigen&#232;re Cipher 维吉尼亚加解密算法

维吉尼亚的加解密有两种方法. 第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文 第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符. 本文要用c++实现第二种方法,并且为了操作方便,使用了MFC框架(附工程下载) 核心代码如下: //cipher.h 额外添加的文件,用来放置相关算法,此文件独立于MFC外,可直接移植到支持CString的项目中 int* CStringToInt(CString str){ //将CString转换为zero