凯撒密码中的单个字符不匹配:Python

时间:2018-09-18 01:45:01

标签: python caesar-cipher

基本上,输入字符串中的字母会循环旋转k,其余字符保持其形式。我为不匹配感到困惑。对于我的代码:

import math
import os
import random
import re
import sys

# Complete the caesarCipher function below.
def caesarCipher(s, k):
    st = []
    for i in range(0,len(s)):
        if 65<=ord(s[i])<=90: 
            temp = ord(s[i])+k
            if (temp>90):
                temp-=26
            st.append(chr(temp))
        elif 97<=ord(s[i])<=122:
            temp = ord(s[i])+k
            if (temp>122):
                temp-=26
            st.append(chr(temp))   
        else: st.append(s[i])
    return ''.join(st)




if __name__ == '__main__':

    s = input()

    k = int(input())

    result = caesarCipher(s, k)

输出总是失败一位,例如 我的:okffng-Qwvc预期的:okffng-Qwvb

我的:Fqcfex-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj预期:Fqbfdx-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj

我似乎无法检测到该错误。

1 个答案:

答案 0 :(得分:2)

凯撒密码的典型表示法是使用模运算符。我可能会从这里开始调试您的代码。

如果代码是 flat 而不是嵌套,我发现代码更容易调试。如果每个功能都做一件小事情,则更容易完全测试一个小功能并将它们装配在一起以具有正确的行为。请看以下示例:

def _caesarLetter(c, k, offset):
    return chr((ord(c)-offset+k)%26+offset)

def caesarLetter(c, k):
    if not c.alpha():
        return c
    return _caesarLetter(c, k, ord('a') if c.islower() else ord('A'))

def caesarCipher(s, k):
    return ''.join(caesarLetter(c, k) for c in s)
  • 第一种方法_caesarLetter将密码应用于单个字母,并且仅用于固定字符编码。它基本上采用整个字母表并将其转换为从0开始,应用密码,然后将字母表移回其起始位置。小写的ascii为97,大写的ascii为65。

  • 第二种方法caesarLetter负责弄清楚在ascii编码中小写字母和大写字母在哪里开始。与其对容易出现拼写错误和不明确错误的65和97进行显式编码,我们只是对它们进行动态计算。 CPU时间便宜。开发人员时间很昂贵。这使意图很清楚。

  • 第三个方法caesarCipher仅对字符串中的所有字母执行此操作,并将它们连接在一起。