Python César De Chiffrement Décodeur

Dans ma leçon, j'ai été chargé de la création d'un César de Chiffrement décodeur qui prend une chaîne de caractères d'entrée et trouve le meilleur possible de la chaîne à l'aide d'une lettre de fréquences. Si vous ne savez pas faire beaucoup de sens, qui fait mais laissez-post à la question:

Écrire un programme qui effectue les opérations suivantes. Tout d'abord, il faut lire une ligne d'entrée, qui est le message codé, et se composent de lettres majuscules et des espaces. Votre programme doit essayer de décoder le message avec tous les 26 valeurs possibles de la maj S; en dehors de ces 26 d'éventuels messages d'origine, imprimer celui qui a la plus grande bonté.
Pour votre commodité, nous allons pré-définir la variable letterGoodness pour vous, une liste de longueur de 26 ce qui équivaut à les valeurs dans le tableau des fréquences au-dessus de

Python César De Chiffrement Décodeur

J'ai ce code pour l'instant:

x = input()
NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler
def SpyCoder(S, N):
    y = ""
    for i in S:
        x = ord(i)
        x += N
        if x > ord('Z'):
            x -= NUM_LETTERS
        elif x < ord('A'):
            x += NUM_LETTERS
        y += chr(x)
    return y  

def GoodnessFinder(S):
    y = 0
    for i in S:
        if x != 32:
            x = ord(i)
            x -= ord('A')
            y += letterGoodness[x]
    return y 

def GoodnessComparer(S):
    goodnesstocompare = GoodnessFinder(S)
    goodness = 0
    v = ''
    for i in range(0, 26):
        v = SpyCoder(S, i)
        goodness = GoodnessFinder(v)
        if goodness > goodnesstocompare:
            goodnesstocompare = goodness
    return v

y = x.split()
z = ''
for i in range(0, len(y)):
    if i == len(y) - 1:
        z += GoodnessComparer(y[i])
print(z)

EDIT: en Fait les modifications suggérées par Cristian Ciupitu
S'il vous plaît ignorer l'indentation des erreurs, il est probablement apparue lorsque j'ai copié mon code.

Le programme fonctionne comme ceci:

  • Prendre l'entrée et de le diviser en une liste
  • Pour chaque valeur de la liste, je le donner à une bonté finder.
  • Il prend la bonté de la chaîne et le compare tout le reste contre, lorsqu'il y a plus de bonté qu'il fait le plus élevé de la bonté de les comparer.
  • Il décale alors que la chaîne de texte, j'en quantité pour voir si la bonté est supérieur ou inférieur

Je ne suis pas très bien où est le problème, le premier test: LQKP OG CV GKIJV DA VJG BQQ
Imprime le bon message: aidez-MOI À LE ZOO

Cependant, le test suivant: UIJT JT B TBNQMF MJOF PG UFYU GPS EFDSZQUJOH
Donne la une ordure de la chaîne d': SGHR RH Z RZLOKD KHMD NE PSAP ENQ CDBQXOSHMF
Quand il est censé être: CECI EST UN EXEMPLE de LIGNE DE TEXTE POUR DÉCRYPTER

Je sais que j'ai de:
Essayez chaque changement de la valeur
Obtenir la "bonté" de la parole
De retour de la chaîne avec la plus grande bonté.

J'espère que mon explication a du sens comme je suis assez confus pour l'instant.

Si vous ajoutez 1 à chaque caractère dans la jonque chaîne 'SGHR RH Z RZLOKD ...' vous obtenez 'CECI EST UN EXEMPLE de ...", de sorte qu'il est très près de la droite.
Vous devriez essayer de remplacer certains de la magie des chiffres significatifs des constantes, par exemple, 65 avec ord('A'), 26 avec NUM_LETTERS. Par la façon GoodnessComparer vous avez range(0, 25) au lieu de (0, 26), est-ce une faute de frappe ou pas? Et une autre chose: dans GoodnessFinder vous n'avez pas besoin de faire ord(i) à chaque fois, seulement quand i est un espace (' ').
input(), est l'équivalent de eval(raw_input()) qui n'a pas de sens, pour le remplacer par un simple raw_input() appel.
Ciupitu: Qui devrait être Python 3 code.
Depuis Débordement de Pile vous permet de poster une réponse à votre propre question et c'est un des devoirs, vous devriez poster votre version finale du décodeur.

OriginalL'auteur Thegluestickman | 2012-05-29