7-16 凯撒密码
原题:
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
.
解题思路:
- 引入
readline
模块并创建接口对象:首先将readline
模块引入,并使用createInterface
方法创建一个接口对象rl
。该对象设置了输入流为标准输入。 - 读取输入并存储:通过监听
'line'
事件,将输入存储在数组buf
中。 - 解析输入:将数组
buf
中的第一个元素赋值给变量str
,将数组buf
中的第二个元素解析为整数并赋值给变量offset
。 - 进行凯撒密码加密:使用扩展运算符将字符串
str
转换成字符数组,对每个字符进行映射转换。对于每个字符,首先获取其ASCII码,判断其是否为大写字母(65 ≤ code ≤ 90)或小写字母(97 ≤ code ≤ 122)。如果是大写字母,则根据凯撒密码算法,将字符偏移量offset
应用到字符的ASCII码上,并将结果转换回字符。如果是小写字母,同样应用字符偏移量offset
,并转换回字符。否则,保持字符不变。将映射后的字符数组使用join
方法连接成字符串,赋值给变量res
。 - 输出加密结果:将加密后的字符串
res
输出。
.
JavaScript(node)代码:
const r = require("readline");
const rl = r.createInterface({
input: process.stdin
});
let buf = [];
rl.on('line', (input) => buf.push(input));
rl.on('close', () => {
let str = buf[0];
let offset = parseInt(buf[1], 10);
let res =[...str].map(i => {
let code = i.charCodeAt(0);
if (65 <= code && code <= 90) {
return String.fromCharCode(((code - 65 + offset) % 26 + 26) % 26 + 65);
} else if (97 <= code && code <= 122) {
return String.fromCharCode(((code - 97 + offset) % 26 + 26) % 26 + 97);
} else {
return i;
}
}).join("");
console.log(res);
//测试点3尽力了,求大神题解
});
.