需要重新审视密码程序
Need fresh eyes on a cipher program
我在 python 的一个在线课程的密码程序上工作了一段时间。我一直在成功和挫折之间来回徘徊,最近我觉得我已经想通了。也就是说,直到我将我得到的输出与课程所说的我实际应该得到的进行比较。当我输入 "The crow flies at midnight!" 和 "boom" 的键时,我应该返回 "Uvs osck rwse bh auebwsih!" 而是返回 "Tvs dfci tzufg mu auebwsih!" 我不知道我的程序在做什么,并且可以从某人那里再看看我的程序。可惜我现实生活中没有人去lol。非常感谢任何帮助。
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!
在你的 vigenere 函数中,转换 set text = text.lower() .
要找到此类问题,只需跟踪一个字母,看看会发生什么,很容易看出它不起作用,因为 'T' 不在字母表中,但 't' 在字母表中,因此您应该将文本转换为小写。
看来是你没有提醒处理space的问题。 "boom"的"m"应该用来加密"crow"的"c",而不是"The"和"crow"之间的space
Ok.The 问题是预期的密码跳过了非字母字符并继续使用相同的下一个字母 key.But 在您的实现中您也跳过了密钥。
The crow
boo mboo // expected
boo boom // your version
所以这是更正后的代码:
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!
我在 python 的一个在线课程的密码程序上工作了一段时间。我一直在成功和挫折之间来回徘徊,最近我觉得我已经想通了。也就是说,直到我将我得到的输出与课程所说的我实际应该得到的进行比较。当我输入 "The crow flies at midnight!" 和 "boom" 的键时,我应该返回 "Uvs osck rwse bh auebwsih!" 而是返回 "Tvs dfci tzufg mu auebwsih!" 我不知道我的程序在做什么,并且可以从某人那里再看看我的程序。可惜我现实生活中没有人去lol。非常感谢任何帮助。
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!
在你的 vigenere 函数中,转换 set text = text.lower() .
要找到此类问题,只需跟踪一个字母,看看会发生什么,很容易看出它不起作用,因为 'T' 不在字母表中,但 't' 在字母表中,因此您应该将文本转换为小写。
看来是你没有提醒处理space的问题。 "boom"的"m"应该用来加密"crow"的"c",而不是"The"和"crow"之间的space
Ok.The 问题是预期的密码跳过了非字母字符并继续使用相同的下一个字母 key.But 在您的实现中您也跳过了密钥。
The crow
boo mboo // expected
boo boom // your version
所以这是更正后的代码:
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!