J'ai essayé de faire un chiffreur de fortune, mais rien ne semble aller mal et ma sortie est courte de plusieurs caractères. Aidez-moi!

Voici mon code:

#Encrypter v1

import random, os, sys

inputstring = input("What is your sentence?(Remove all punctuation!)\n")

inputstringnum = input("How many levels of encryptiion? Maximum encrytion lentgh is 24.\n")

inputstringnum1 = int(inputstringnum)

#Code

def list_randomizer(inputstring1):
    inputlist = list(inputstring1)
    outputlist = inputlist[::-1]
    return outputlist

def list_changer(var1, crypt_num):
    alphabet_list = list("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz") #To find the index
    caps_list = list("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ")
    output_list = []
    for item in var1:
        tmp2 = var1.pop(0)
        if tmp2 in alphabet_list == True:
            tmp3 = alphabet_list.index(tmp2)
            tpm3 = int(tmp3) #Failsafe
            object_int = tmp3 + crypt_num #Encrpyting on desired depth
            tmp4 = alphabet_list[object_int]
            output_list.append(tmp4)
        if tmp2 in caps_list == True and tmp2 in caps_list != True:
            tmp3 = caps_list.index(tpm2)
            tmp3 = int(imp3)
            object_int = tmp3 + crypt_num
            tmp4 = caps_list[object_int]
            output_list.append(tmp4)
        else:
            output_list.append(tmp2)
    return output_list

temp1 = list_changer(list_randomizer(inputstring), inputstringnum1)

print(temp1)
-3
Kiro 16 juil. 2015 à 13:35

3 réponses

Meilleure réponse

Comme d'autres l'ont indiqué, itérer sur var1 et en faire surgir des éléments conduit à votre premier problème d'avoir moins de caractère dans votre sortie que dans votre entrée.

Vous avez également un code trop compliqué, notamment:

  • utilisation de list('abc') au lieu d'utiliser directement des chaînes pour itérer sur ou rechercher des index.
  • les comparaisons avec True qui ne sont pas nécessaires en python: if a: ou if t in ['a','b']: sont des tests parfaitement valides en python.
  • utilisation de listes artisanales de personnages. Utilisez la ord fonction intégrée ou la {{X1 }} et ascii_uppercase chaînes du string module.

Je simplifierais votre code pour:

def list_changer(input_string, encrypt_level):
    output_list = []
    for character in input_string:
        char = ord(character) # convert character to ascii code
        if not ((96 < char < 123) or (64 < char < 91)):
            # if not ascii alphabetic value, ignore it
            output_list.append(character)
            continue
        offset = 97 if char > 96 else 65 # check whether it is upper or lower case
        char = (char - offset + encrypt_level) % 26 # encode it
        character = chr(char + offset) # convert back to a character
        output_list.append(character)
    return ''.join(output_list)

if __name__ == "__main__":
    inputstring = input("What is your sentence?\n")
    encrypt = int(input("How many levels of encryption?\n"))
    computed_string = list_changer(inputstring[::-1], encrypt)
    print(computed_string)
0
301_Moved_Permanently 16 juil. 2015 à 11:50

Tout d'abord, == et in ne se comportent pas bien à cause du chaînage des opérateurs.

a in ['a','b'] == True

Ce qui précède renvoie False lorsqu'il devient - (a in ['a','b']) and (['a','b'] == True).

Vous n'avez pas besoin de vérifier contre True, utilisez simplement directement son résultat dans la condition.

Deuxièmement, quand vous le faites -

for item in var1:

Vous parcourez les éléments de var1, puis si vous le faites var1.pop(0), il manquera l'élément suivant.

Troisièmement, votre deuxième if devrait être un elif, sinon il fait en sorte que le même élément soit chiffré et placé dans la liste ainsi que l'ajout des non chiffrés à la liste.

Code-

import random, os, sys

inputstring = input("What is your sentence?(Remove all punctuation!)\n")

inputstringnum = input("How many levels of encryptiion? Maximum encrytion lentgh is 24.\n")

inputstringnum1 = int(inputstringnum)

#Code

def list_randomizer(inputstring1):
    inputlist = list(inputstring1)
    outputlist = inputlist[::-1]
    return outputlist

def list_changer(var1, crypt_num):
    alphabet_list = list("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz") #To find the 

index
    caps_list = list("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ")
    output_list = []
    for item in var1:
        tmp2 = item
        if tmp2 in alphabet_list:
            tmp3 = alphabet_list.index(tmp2)
            tpm3 = int(tmp3) #Failsafe
            object_int = tmp3 + crypt_num #Encrpyting on desired depth
            tmp4 = alphabet_list[object_int]
            output_list.append(tmp4)
        elif tmp2 in caps_list:
            tmp3 = caps_list.index(tmp2)
            tmp3 = int(tmp3)
            object_int = tmp3 + crypt_num
            tmp4 = caps_list[object_int]
            output_list.append(tmp4)
        else:
            output_list.append(tmp2)
    return output_list

temp1 = list_changer(list_randomizer(inputstring), inputstringnum1)

print(temp1)
0
Anand S Kumar 16 juil. 2015 à 10:59

Le problème est avec ces 2 lignes à l'intérieur de votre fonction list_changer -

for item in var1:
    tmp2 = var1.pop(0)

Vous sortez de la même liste que celle que vous parcourez.

tmp2 = item

Au lieu de

tmp2 = var1.pop(0)

C'est pourquoi vous obtenez un mauvais nombre de résultats.
Donc, fondamentalement, votre fonction list_changed devrait ressembler à -

def list_changer(var1, crypt_num):
    alphabet_list = list("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz") #To find the index
    caps_list = list("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ")
    output_list = []
    for item in var1:
        tmp2 = item
        if tmp2 in alphabet_list:
            tmp3 = alphabet_list.index(tmp2)
            tpm3 = int(tmp3) #Failsafe
            object_int = tmp3 + crypt_num #Encrpyting on desired depth
            tmp4 = alphabet_list[object_int]
            output_list.append(tmp4)
        elif tmp2 in caps_list:
            tmp3 = caps_list.index(tpm2)
            tmp3 = int(imp3)
            object_int = tmp3 + crypt_num
            tmp4 = caps_list[object_int]
            output_list.append(tmp4)
        else:
            output_list.append(tmp2)    
    return output_list



Autres problèmes
- Problème 1

tmp2 in alphabet_list == True

Donnera toujours false, car votre alphabet_list est une liste, ce qui donne -

tmp2 in (alphabet_list == True)

Remplacez-le par -

if tmp2 in alphabet_list:


- Problème 2

if tmp2 in caps_list == True and tmp2 in caps_list != True:

Ne se tiendra jamais vrai.
REMPLACEZ AVEC CELA -

elif tmp2 in caps_list
0
Kamehameha 16 juil. 2015 à 10:59