作为我目前正在参加的 CS50 哈佛编程课程的一部分,我正在做一个名为“Vigenere”的练习。
Vigenere 的密码应该有一个密钥作为输入,例如“abcd”。这将根据密钥中的每个字符对任何明文进行编码,其中 a = 0 和 b = 1 等。因此,带有明文“aa!aa”的密钥“abcd”将给出“ab!cd”。如果明文比密钥长,则密钥应该循环回 [0] 并重新开始,直到明文全部被编码。然而,非字母字母应该正常打印出来。
我的程序做的一切都是正确的(它逐行进行并且符合预期的行为),除非我收到以大写字母后跟小写字母开头的输入我的程序用小写键打印一个不同的字母然后它应该给我. 例如:键:“Baz”。明文:“aaa”。结果:“bgz”应该返回“baz”。
一直在谷歌搜索,调试,但就是想不通。也尝试过很多其他不同的方式,但我就是无法让它发挥作用。(对不起,复制粘贴,你可能会注意到我已经发布了一个类似的问题,但是那是在 C 中(这是 python),它是另一种错误)
代码:
import sys
if len(sys.argv) != 2 or not sys.argv[1].isalpha():
print("usage: python vigenere.py keyword")
sys.exit()
cipher = sys.argv[1]
plaintext = input("plaintext: ")
j = 0
def code(j):
for key in cipher:
if key.islower():
return ord(cipher[j]) - 97
if key.isupper():
return ord(cipher[j]) - 65
print("ciphertext: ", end="")
for letters in plaintext:
if letters.islower():
print(chr(((ord(letters) - 97 + code(j)) % 26) + 97), end="")
j += 1
if letters.isupper():
print(chr(((ord(letters) - 65 + code(j)) % 26) + 65), end="")
j += 1
if j == len(cipher):
j = 0
if not letters.isalpha():
print(letters, end="")
print("")
四季花海
相关分类