0
votes

Déplacer tous les alphabets d'une ficelle par une certaine étape

  • Entrée: ['banane', 7] code> # chaîne et taille de l'étape li>
  • Sortie requise: 'utgtgt' code> # Chaque caractère de la chaîne a déplacé à l'envers à l'étape Taille de l'étape Li>
    import ast  
    in_string = input()  
    lis = ast.literal_eval(in_string)  
    st = lis[0]  
    step = lis[1]  
    alphabets = 'abcdefghijklmnopqrstuvwxyz'  
    password = ''  
    for letter in st:  
        if letter in alphabets:  
            index_val = alphabets.index(letter) - (step)  
            password += alphabets[index_val]  
    
    print(password)
    

4 commentaires

J'ai "uttt" quand j'essaie


Que devriez-vous 'a' devenir? Ou n'importe quel abcdef ?


Puisque la banane devrait renvoyer ugtgt i gues a deviendrait t ?


Est-ce que cela répond à votre question? Fonction César Cipher à Python


3 Réponses :


7
votes

Le module de chaîne contient des méthodes pour Créer un dictionnaire de transformation et un Traduire la méthode pour faire exactement ce que vous voulez: xxx

sortie: xxx

Vous lui donnez la chaîne d'origine et une chaîne longue égale pour mapper des lettres et appliquer ce dictionnaire à l'aide de str.translate (Dictionnaire) .

Les chaînes tranchées équivalent à: xxx

qui est ce que votre pas est pour.


voir Compréhension de la notation de tranche Si vous n'avez jamais vu de tranchant en chaîne en utilisation.


2 commentaires

Vraiment soigné! La réponse donnée semble ne pas modifier que des caractères minuscules. Comment allumera-t-on aussi de déplacer des caractères majuscules aussi? (E.G. banane à utgtgt , plutôt que utntnt )


@saha je pensais que c'est clair - vous appliquez la même chose pour les lettres majuscules. Je les ai éditées aussi.



3
votes

En traitant chaque caractère et en vérifiant son cardinal NO et la prise de calcul en conséquence vous aider à atteindre le résultat

def func(string, size):
    if size%26==0:
        size=26
    else:
        size=size%26
    new_str = ''    
    for char in string:
        if char.isupper():
            if ord(char)-size<ord('A'):
                new_str+=chr(ord(char)-size+26)
            else:
                new_str+=chr(ord(char)-size)
        elif char.islower():
            if ord(char)-size<ord('a'):
                new_str+=chr(ord(char)-size+26)
            else:
                new_str+=chr(ord(char)-size)         
    return new_str


res =func('baNaNa', 7)   
print(res)

# output utGtGt


0 commentaires

2
votes

Voici une solution simple qui utilise l'opérateur % modulo pour passer des lettres à l'envers.

Il collecte essentiellement toutes les lettres d'un dictionnaire de recherche d'index inverse, de sorte que la recherche de positions de lettre est O (1) au lieu d'utiliser list.index () , qui est linéaire o (n) recherches.

alors il passe par chaque lettre et calcule la valeur de décalage de l'index de la lettre par exemple. Pour la lettre A avec une valeur de décalage de 7 , le calcul sera (0 - 7)% 26 , qui donnera 19 , la position de u .

puis une fois que vous avez cette valeur de décalage, convertissez-la en majuscules ou en minuscule en fonction du cas de l'original / em> lettre.

à la fin nous venons de str.join () la liste des résultats dans une chaîne. Ceci est plus efficace que faire + = pour rejoindre des chaînes.

Démo: xxx

sortie: xxx

Je vais probablement aller avec @ Patrick Artner's solution pythonique. Je viens de montrer la mise en œuvre ci-dessus comme un exercice d'apprentissage :-).


0 commentaires