题目要求:
凯撒密码
(让上帝的归上帝,凯撒的归凯撒)
下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔ ‘O’,以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
提示:
charCodeAt()
String.fromCharCode()
思路
首先要找到字母
如果出现特殊字符怎么办?我的第一想法是用正则判断是不是字母,只对字母进行替换
用正则表达式 /\w/可以找到字母
\w 元字符用于查找单词字符。
单词字符包括:a-z、A-Z、0-9,以 _ (下划线) 字符。
或者也可以使用/[A-Z]/这样的表达式
找到字母对应的
charCode
用
fromCharCode
构造对应的字母
console.log('A'.charCodeAt()) //65
console.log('Z'.charCodeAt()) //90 (90+65)/2 = 77.5
1 A->14 N
2 B->15 O
...
13 M->26 Z 因此只要字母小于77.5的就将编码增加13,大于77.5的就将编码减小13即可得到对应的字母,
- 替换原本的字母
既然使用正则那么可以使用String.replace()
方法来进行替换
replace方法默认只进行一次替换,即替换第一个匹配的字符串,只用/\w/的话只会匹配第一个字母,因此要用全局匹配/g,这样就能匹配每一个字母。
replace方法常用于将某个字符串替换为另一个字符串即
'red'.replace('red','blue') //'blue'
但如果你提供的是一个替换方法,那么他将对匹配的字符串调用替换方法,传入的参数为匹配的字符串(如果使用全局匹配,那么将对每一个匹配字符串调用该替换方法),替换方法的返回值为该匹配字符串的替换字符串。
replace方法将在所有匹配字符串替换结束后返回,要注意的是replace方法并不会改变原字符串,返回值为一个经过替换后的新字符串。
代码
function rot13(str) {
//正则的替换是一次性替换,因此需要使用/g全局匹配,replace将对每一个匹配成功的字符串调用替换方法
return str.replace(/\w/g, (s) => {
var s_code = s.charCodeAt(0);
if (s_code <= 77) {
return String.fromCharCode(s_code + 13);
} else{
return String.fromCharCode(s_code - 13);
}
});
}