首页 > 解决方案 > 凯撒密码中的单个字符不匹配:Python

问题描述

本质上,输入字符串中的字母循环旋转 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)

输出总是失败,例如 My: okffng-Qwvc Expected: okffng-Qwvb

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

我似乎无法检测到错误。

标签: pythoncaesar-cipher

解决方案


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

如果代码是扁平的而不是嵌套的,我发现代码更容易调试。如果每个函数只做一件小事,就更容易完全测试一个小函数并将它们组合在一起以获得正确的行为。举个例子:

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只是对字符串中的所有字母执行此操作并将它们连接在一起。


推荐阅读