如何修改ShiftCipher位移密码代码实现字母按指定偏移量向右加密
问题根因
你当前代码实现左移的核心问题在__init__方法的cipher构造逻辑:
- 计算密文字母索引时用了
i - abs(self.shift),相当于每个明文字母向左数shift位取密文,自然是左移效果 - 多余的
abs()调用会导致你传入正、负shift值的效果完全一致,丢失了反向移位的能力
修复方案
直接修改__init__中cipher和decoder的索引计算逻辑,把减法改为加法,移除不必要的abs()即可,修改后的代码如下:
def __init__(self, shift): """ Constructs a ShiftCipher for the specified degree of shift (positive or negative), by building a cipher (dictionary mapping from letters to other letters), and a decoder (the inverse of the cipher) """ self.shift = shift self.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" # 右移逻辑:明文字母索引i + shift后模总长度得到密文索引 self.cipher = {self.letters[i]: self.letters[(i + self.shift) % len(self.letters)] for i in range(len(self.letters))} # 解密是加密的逆操作,索引减shift即可 self.decoder = {self.letters[(i + self.shift) % len(self.letters)]: self.letters[i] for i in range(len(self.letters))}
效果验证
修改后传入shift=13加密测试文本"I come to bury Caesar, not to praise him.",即可得到你预期的V pBzr GB oHEL PnrFnE, ABG GB CEnvFr uvz输出。
内容的提问来源于stack exchange,提问作者nomoresky
相关产品推荐
相关产品推荐

