我已经在python的密码程序上工作了一段时间用于在线课程。我一直在成功和挫折之间来回走动,最近我以为我已经弄明白了。也就是说,直到我比较我得到的课程所说的实际应该得到的输出。当我输入"乌鸦在午夜飞行!"和#34;繁荣"的关键,我应该回来" Uvs osck rwse bh auebwsih!"而是回过头去看电视剧#34; Tvs dfci tzufg mu auebwsih!"我对我的程序正在做什么感到茫然,并且可以使用第二次查看某人的程序。不幸的是,我现在没有一个人去找哈哈。非常感谢任何帮助。
alphabet = "abcdefghijklmnopqrstuvwxyz"
def alphabet_position(letter):
lower_letter = letter.lower() #Makes any input lowercase.
return alphabet.index(lower_letter) #Returns the position of input as a number.
def vigenere(text,key):
m = len(key)
newList = ""
for i in range(len(text)):
if text[i] in alphabet:
text_position = alphabet_position(text[i])
key_position = alphabet_position(key[i % m])
value = (text_position + key_position) % 26
newList += alphabet[value]
else:
newList += text[i]
return newList
print (vigenere("The crow flies at midnight!", "boom"))
# Should print out Uvs osck rmwse bh auebwsih!
# Actually prints out Tvs dfci tzufg mu auebwsih!
答案 0 :(得分:1)
在你的vigenere函数中,转换set text = text.lower()。
要找到这样的问题,只需按一个字母查看会发生什么,很容易看出它不起作用,因为' T'不在字母表中而是在' t'所以你应该将文本转换为小写。
答案 1 :(得分:1)
看起来问题是你没有提醒处理空格。 “繁荣”的“m”应该用来加密“乌鸦”的“c”,而不是“The”和“crow”之间的空间
答案 2 :(得分:1)
好了。问题是预期的密码跳过了非字母字符并继续使用相同的密钥继续写下一个字母。但是在你的实现中你也跳过了密钥。
乌鸦
boo mboo //预期
boo boom //你的版本
所以这是更正后的代码:
alphabet = "abcdefghijklmnopqrstuvwxyz"
def alphabet_position(letter):
lower_letter = letter.lower() #Makes any input lowercase.
return alphabet.index(lower_letter) #Returns the position of input as a number.
def vigenere(text,key):
text_lower = text.lower()
m = len(key)
newList = ""
c = 0
for i in range(len(text)):
if text_lower[i] in alphabet:
text_position = alphabet_position(text[i])
key_position = alphabet_position(key[c % m])
value = (text_position + key_position) % 26
if text[i].isupper():
newList += alphabet[value].upper()
else:
newList += alphabet[value]
c += 1
else:
newList += text[i]
return newList
print (vigenere("The crow flies at midnight!", "boom"))
# Should print out Uvs osck rmwse bh auebwsih!
# Actually prints out Tvs dfci tzufg mu auebwsih!