w3cschool算法挑战记录1-16(位移密码算法挑战)

下面我们来介绍著名的凯撒密码Caesar cipher,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。

分析,这是个密码学的经典场景,一看就是利用字母的unicode码增减实现的,在unicode码中
A~Z :65~90,a~z :97~122,0~9 : 48~57,因此通过unicode码的计算就可以实现密码变换
这里需要用到两个个函数,分别是:

charCodeAt(),将为转换成UNICODE码,如'ABC'.charCodeAt(0)  // returns 65

string.fromCharCode(),将UNICODE码转换为文字,如   String.fromCharCode(65, 66, 67);   // returns "ABC"

示例程序:

function rot13(str){ // LBH QVQ VG!
  function rot13char(char){
    if (char.charCodeAt()>=65&&char.charCodeAt()<=90){
      return char.charCodeAt()>=78?String.fromCharCode(char.charCodeAt()-13):String.fromCharCode(char.charCodeAt()+13);
     }else{
      return char; 
     }
  }
  str=str.split("").map(rot13char).join("");
  return str;
}

// Change the inputs below to test
rot13("SERR PBQR PNZC");

分析如下:

1、通过函数嵌套实现两个功能,分别是函数的切片和重组,unicode码的转换和变化;代码写的很精简
2、str=str.split("").map(rot13char).join("");    一行代码实现了先切片后重组的全过程,我试着分析一下:
i、先执行str.split(""),字符串切片;
ii、切片完成的数组通过map函数,实现数组的重新组合()并通过join实现了无缝拼合;
iii、map的函数通过调用变量末实现了unicode的自增;
3、rot13char函数,使用了if语句判断是否为英文,65~90,如果不在这个区间则直接返回,在区间的数+13,如果unicode值大于78则为-13,实现了英文字母的轮询;
i、这里面用到了js的三元表达式,对于unicode值大于78的数字进行判断

整个代码写的很巧妙,也很精简,值得学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值