如何实现一行代码的双向Caesar cipher加解密函数?
一行实现支持正负Key的凯撒密码函数
要实现一行代码的双向凯撒密码,不用搞反转字母表那套,直接通过修正模运算的负数偏移就能搞定:
// 支持大小写的一行实现 const cypher = (input, key) => input.split('').map(c => /[a-zA-Z]/.test(c) ? (c === c.toLowerCase() ? 'abcdefghijklmnopqrstuvwxyz' : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ').charAt((('abcdefghijklmnopqrstuvwxyz'.indexOf(c.toLowerCase()) + key + 26) % 26)) : c ).join('');
核心思路
- 取消分支判断:用
(偏移值 + key + 26) % 26处理负数key——比如key=-2,相当于正向偏移24,这样不管key正负,都能得到合法的字母索引,不需要反转字母表。 - 兼容大小写:原代码没处理大写字母,这里补充了判断,保证加密后大小写和原字符一致。
- 极简写法:用
charAt替代split后取索引,能稍微简化代码(也可以继续用split,效果一致)。
仅小写版本(更短)
如果只需要处理小写字母,代码可以进一步精简:
const cypher = (input, key) => input.split('').map(c => /[a-z]/.test(c) ? 'abcdefghijklmnopqrstuvwxyz'.charAt((('abcdefghijklmnopqrstuvwxyz'.indexOf(c) + key + 26) % 26)) : c ).join('');
原代码的问题所在
你之前的双向函数用if分支切换字母表和key符号,其实是多此一举——凯撒密码的解密本质就是用负key执行加密操作,直接通过模运算修正负数偏移,就能去掉分支逻辑,实现优雅的一行代码。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

