【问题标题】:Caesar Cipher algorithm with strings and for loop Python带有字符串和for循环Python的Caesar Cipher算法
【发布时间】:2016-02-07 10:37:42
【问题描述】:

作业是编写一个接收 2 个参数的 Caesar Cipher 算法,第一个是字符串参数,第二个告诉字母表移动多远。第一部分是设置一个方法,设置两个字符串,一个普通的,一个移位的。我已经做到了。然后我需要循环遍历原始字符串以构建新字符串,方法是找到原始字母并从移位的字符串中选择适当的新字母。我花了至少两个小时盯着这个,并和我的老师谈过,所以我知道我在做一些正确的事情。但至于 while 循环中发生了什么,我真的不知道。任何朝着正确方向的提示或推动都会非常有帮助,所以我至少有一个开始的地方会很棒,谢谢。

def cipher(x, dist):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    shifted = "xyzabcdefghijklmnopqrstuvw"
    stringspot = 0
    shiftspot = (x.find("a"))
    aspot = (x.find("a"))
    while stringspot < 26:
        aspot = shifted(dist)
        shifted = 
        stringspot = stringspot + 1
        ans = 
    return ans

print(cipher("abcdef", 1))
print(cipher("abcdef", 2))
print(cipher("abcdef", 3))
print(cipher("dogcatpig", 1))

【问题讨论】:

  • 你应该在你没有得到的while循环部分使用debug,比如DEBUG = True def log(s): if DEBUG: print s 然后在循环中使用log("some string")`
  • 请注意:您已经手动设置了shifted,但字符串应该根据dist参数而有所不同。如果dist 为1,则shifted 应以b 开头。您应该动态构建shifted。此外,您稍后使用带有圆括号的shifted(好像它是一个函数),您应该使用方括号。此外,x 不能有字母 a,例如cipher("lol", 1) 应该返回 "mpm"
  • 另外,您的 while 循环迭代 26 次。然而,迭代x 的每个字母(可能比 26 更短/更长)是合理的,所以这可能是你应该改变的。我建议您尝试手动解决某些情况(例如,x 的长度为 1 个字母时会发生什么情况?如果dist 等于 0 会发生什么情况?)

标签: python


【解决方案1】:

这里有一些推送和提示:

  1. 您应该验证您的输入。尤其要确保移位距离是“合理的”,其中合理意味着您可以处理的事情。我推荐

  2. 如果最大移位量为 25,则字母“a”加 25 将得到“z”。字母“z”加 25 将超出字母表的末尾。但它不会超过两个字母的结尾。所以这是处理环绕的一种方法。

  3. 用户@zondo 在他的解决方案中处理大写字母。您没有提及是否要处理它们。你可能想和你的老师澄清一下。

  4. 如果您了解字典,您可能想要构建一个以便轻松地将旧字母映射到新字母。

  5. 您需要意识到字符串被视为元组或列表 - 您可以对它们进行索引。我没有看到你在代码中这样做。

  6. 您可以使用ord() 获取字母的“ASCII 码”数字。这些数字是任意的,但大写和小写数字在 26 的范围内紧密地组合在一起。这意味着您可以用它们进行数学运算。 (例如,ord('a') 是 97。不是超级有用。但 ord('b') - ord('a') 是 1,这可能很高兴。)

【讨论】:

  • ord() 的结果不是任意的,但是对于 10 秒钟没有查看 ascii 代码的人来说,您可以称它们为不直观的。我还认为将这个功能带入游戏更令人讨厌。没有什么比他的alphabet 字符串或string.ascii_lowercase 更简单了。
【解决方案2】:

alphabetshifted 应该是原始流和密文之间的映射。循环的工作是遍历流中的所有字母替换它们。更具体地说,alphabet 中的字母和 shifted 中的替代字母位于同一索引中,因此映射。在伪代码中:

ciphertext = empty
for each letter in x
    i = index of letter in alphabet
    new_letter = shifted[i]
    add new_letter to ciphertext

整个循环可以简化为一个理解列表,但这不应该是您最关心的问题。

要获得比上述伪代码更直接的映射,请查看字典。

在您的代码中突出的另一件事是shifted 的生成,它应该取决于参数dist,因此它不能只是硬编码。所以,如果dist 是 5,shifted 中的第一个字母应该是 alphabet 中 0+5 处的任何内容,依此类推。提示:模运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2013-11-02
    • 2017-03-25
    • 2022-01-26
    • 2013-11-08
    • 2019-06-05
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多