需要重新审视密码程序

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!