[炼手Rust]凯撒密码

192 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个编程挑战:凯撒密码。

71SgSx51bbL.jpg

提问

创建凯撒密码的实现。

凯撒密码是一种简单的移位密码,它依赖于使用 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

  1. 判断当前char是否是字母,使用方法is_ascii_alphabetic
  2. 判断当前char的大小写,使用方法is_ascii_uppercase
  3. 'a'的数值表达,使用b'a'