Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个编程挑战:凯撒密码。
提问
创建凯撒密码的实现。
凯撒密码是一种简单的移位密码,它依赖于使用 0 到 26 之间的整数密钥调换字母表中的所有字母。由于模算术,使用 0 或 26 的密钥将始终产生相同的输出。字母会移动与键值一样多的值。
旋转密码的一般表示法是 ROT + <key>。最常用的旋转密码是 ROT13。
拉丁字母表上的 ROT13 如下:
普通:abcdefghijklmnopqrstuvwxyz
密码:nopqrstuvwxyzabcdefghijklm
空格和标点符号不做移位。
例如:
Input:omg,5
Output:trl
Input:c,0
Output:c
Input:The quick brown fox jumps over the lazy dog.,13
Output:Gur dhvpx oebja sbk whzcf bire gur ynml qbt.
模板:
pub fn rotate(input: &str, key: u8) -> String {}
分析
对于输入input,移位密钥key。
我们先遍历这个字符串的每个字符:
- 如果当前字符是字母,无论大小写,值加上
key在对 26 取模。 - 其他字符,保持原样。
解决方案
pub fn rotate(input: &str, key: u8) -> String {
input.chars().map(|c| {
if c.is_ascii_alphabetic() {
let base = if c.is_ascii_uppercase() { b'A' } else { b'a' };
(((c as u8 + key - base) % 26) + base) as char
} else {
c
}
}).collect()
}
Trick
- 判断当前
char是否是字母,使用方法is_ascii_alphabetic。 - 判断当前
char的大小写,使用方法is_ascii_uppercase。 'a'的数值表达,使用b'a'。