问题描述
本质上,输入字符串中的字母循环旋转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预期:okffng-Qwvb
我的:Fqcfex-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj预期:Fqbfdx-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj
我似乎无法检测到该错误。
1楼
凯撒密码的典型表示形式是使用模数运算符。 我可能会从那里开始调试您的代码。
我发现如果代码是扁平的而不是嵌套的,那么代码更容易调试。 如果每个功能都做一件小事情,则更容易完全测试一个小功能并将它们装配在一起以具有正确的行为。 请看以下示例:
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编码caesarLetter
写字母和大写字母在哪里开始。 与其对容易出现拼写错误和不明确错误的65和97进行显式编码,我们只是对它们进行动态计算。 CPU时间便宜。 开发人员时间很昂贵。 这表明了意图。第三种方法
caesarCipher
只是对字符串中的所有字母执行此操作,并将它们连接在一起。