python - 凯撒密码中的单个字符不匹配: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
我似乎无法检测到错误。
解决方案
凯撒密码的典型表示使用模运算符。我可能会从调试您的代码开始。
如果代码是扁平的而不是嵌套的,我发现代码更容易调试。如果每个函数只做一件小事,就更容易完全测试一个小函数并将它们组合在一起以获得正确的行为。举个例子:
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
只是对字符串中的所有字母执行此操作并将它们连接在一起。
推荐阅读
- json - Ajax - JSON - 初学者
- flutter - 在颤振中使用流生成器时出现错误
- typescript - 打字稿:需要帮助强制对函数响应进行严格输入
- r - 如何在ggplot中为数字x轴的条形图添加直接标签
- algorithm - 如何在 KD-Tree 中实现范围搜索
- c# - 具有预选值的 MVC 下拉列表不允许在必填字段时提交表单
- spring-boot - 在反应性 crud 存储库 @Query 方法中使用对象属性作为参数
- ios - 如何从 Callkit 最近的通话记录 iOS Objective-c 打开应用程序?
- angular - 如何测试角度服务工作者
- python - 使用 sympy 积分指数函数