2017-10-21 46 views
0

Je fais une mission de cryptographie en python et je dois: - découper une chaîne - remplacer les lettres - rejoindrons pour qu'il soit un mot.python comment diviser une chaîne et rejoindrons

Ceci est le code complet, mais je suis bloqué sur la boucle for sous def encode(plain).

""" crypto.py 
Implements a simple substitution cypher 
""" 

alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
key = "XPMGTDHLYONZBWEARKJUFSCIQV" 

def menu(): 

    print("Secret decoder menu") 
    print("0) Quit") 
    print("1) Encode") 
    print("2) Decode") 
    print("What do you want to do?") 
    response = input() 
    return response 

def encode(plain): 

for i in range(len(plain)): 

    plain = plain.upper() 
    x = plain[i:i+1] 
    y = alpha.index(x) 
    z = key[y:y+1] 
    plain[x] = z 

return plain 

def main(): 

keepGoing = True 
    while keepGoing: 

    response = menu() 

    if response == "1": 

     plain = input("text to be encoded: ") 
     print(encode(plain)) 

    elif response == "2": 
     coded = input("code to be decyphered: ") 
     print (decode(coded)) 

    elif response == "0": 
     print ("Thanks for doing secret spy stuff with me.") 
     keepGoing = False 

    else: 
     print ("I don't know what you want to do...") 

return main 

main() 
menu() 
+4

entrée de l'échantillon et les résultats attendus serait bien. –

+2

vous devez mettre en retrait le code sous votre fonction définitions – 0TTT0

+0

menu décodeur secret 0) Quitter 1) Encode 2) Decode Que voulez-vous faire? texte à coder: bonjour L T Z Z E BONJOUR – Matteo

Répondre

1

La façon la plus simple à mettre en œuvre cette substitution est d'utiliser la compréhension du dictionnaire et de la liste:

alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
key = "XPMGTDHLYONZBWEARKJUFSCIQV" 
converter = {a:b for a, b in zip(alpha, key)} 
def encode(s): 
    return ''.join(converter[i] for i in s) 

def decode(s): 
    reverse = {b:a for a, b in converter.items()} 
    return ''.join(reverse[i] for i in s) 

def main(): 
    response = input("Enter 1 to decode, 2 to encode: ") 
    if response == "1": 
     the_string = input("Enter the scrambled string: ") 
     print("The result is ", decode(the_string)) 
    elif response == "2": 
     the_string = input("Enter the plain string: ") 
     print("The result is ", encode(the_string)) 
main() 
+0

Dans votre code, 'reverse' se termine comme' converter'. J'utiliserais 'converter = dict (zip (alpha, clé))' et 'reverse = dict (zip (clé, alpha))' (ou 'reverse = {b: a pour a, b dans converter.items()} '). –

+0

@MatthiasFripp merci de le signaler. S'il vous plaît voir ma récente édition. – Ajax1234

0

Si vous essayez de mettre en œuvre votre propre solution ne @ comme Ajax1234 dire.

mais il est plus facile avec string translate

alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
key = "XPMGTDHLYONZBWEARKJUFSCIQV" 
crypto = maketrans(alpha, key) 

.... 
the_string = input("Enter the scrambled string: ") 
the_string = the_string.upper() 
encrypted = the_string.translate(crypto) 
+0

mon professeur nous a dit de n'utiliser que du code standard, donc nous ne pouvons pas utiliser la méthode translate(). Nous ne pouvons pas non plus changer la fonction main(), nous devons donc fondamentalement convertir les messages secrets à l'aide de la manipulation de chaînes. Sous def encoder (plain) j'ai déjà tranché la chaîne "plain" et comparé les caractères aux chaînes "alpha" et "key" mais je ne sais pas comment les combiner à nouveau en un mot – Matteo