Caesar Cipher中的单字符不匹配:Python

问题描述 投票:1回答:1

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

我似乎无法检测到这个bug。

python caesar-cipher
1个回答
2
投票

Caesar 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,而对于大写,它是65。
  • 第二种方法caesarLetter负责确定ascii编码中小写和大写字母的起始位置。我们只是动态地计算它们,而不是明确地编码65和97,这很容易产生拼写错误和不清楚的错误。 CPU时间便宜。开发人员时间很贵。这使得意图清晰。
  • 第三种方法caesarCipher只对字符串中的所有字母执行此操作并将它们连接在一起。
© www.soinside.com 2019 - 2024. All rights reserved.