Pracowałem na chwilę w programie Cipher w Pythonie na kurs online. Wstaliam tam iz powrotem między sukcesami a wyznaczonymi plecami, a niedawno pomyślałem, że to zrozumiałem. Oznacza to, że dopiero w porównaniu z wyjściem dotarłem do tego, co kurs powiedział, że powinienem być zdobyć. Kiedy wprowadzam "w linii prostej, leci o północy!" I klucz "wysięgnika", powinienem wrócić "UVS Osck rwse bh auebwsih!" Ale zamiast tego wrócić "TVS DFCI TZUFG MU AUEBWSIH!" Jestem z powodu tego, co robi mój program i mógł użyć drugiego spojrzenia na mój program od kogoś. Niestety, nie mam osoby w prawdziwym życiu, aby iść do lol. Każda pomoc jest bardzo doceniana.

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!
2
Brian Burns 26 czerwiec 2017, 01:57

3 odpowiedzi

Najlepsza odpowiedź

OK

Kruk

Boo mboo // oczekiwano

boo boom // twoja wersja

Oto skorygowany kod:

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!
1
Community 20 czerwiec 2020, 09:12

W funkcji Vigenere, przekonwertuj tekst = tekst.Lower ().
Aby znaleźć takie problemy, podążają za jedną literą i zobacz, co się stanie, było bardzo łatwo zobaczyć, że nie działa, ponieważ "T" nie jest w alfabetu, ale "T", więc powinieneś przekonwertować tekst na małe litery.

1
doratheexplorer0911 25 czerwiec 2017, 23:10

Wygląda na to, że problem polega na tym, że nie przypomniesz sobie poradzić ze spacjami. "M" "Boom" należy użyć do szyfrowania "C" "Wrona", a nie przestrzeni między "The" i "Wrona"

1
EsotericVoid 25 czerwiec 2017, 23:19