凯撒密码中的单个字符不匹配:Python
Single character mismatch in Caesar Cipher: 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)
输出总是失败一个,比如
我的:okffng-Qwvc 预期的:okffng-Qwvb
我的:Fqcfex-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj 预期:Fqbfdx-Qttp-ts-ymj-Gwnlmy-Xnij-tk-Qnkj
我似乎无法检测到错误。
凯撒密码的典型表示使用模数运算符。我可能会从那里开始调试您的代码。
我发现代码如果是 flat 而不是 nested 更容易调试。如果每个函数只做一件小事,就更容易完全测试那个小函数并将它们组合在一起以获得正确的行为。举个例子:
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
只是对字符串中的所有字母执行此操作并将它们连接在一起。
本质上,输入字符串中的字母循环旋转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
我似乎无法检测到错误。
凯撒密码的典型表示使用模数运算符。我可能会从那里开始调试您的代码。
我发现代码如果是 flat 而不是 nested 更容易调试。如果每个函数只做一件小事,就更容易完全测试那个小函数并将它们组合在一起以获得正确的行为。举个例子:
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
只是对字符串中的所有字母执行此操作并将它们连接在一起。