0
votes

Comment incrémenter les caractères alphabétiques sans obtenir des caractères spéciaux après z?

Je dois créer un programme qui obtient une chaîne et un entier n ; Il incremportera chaque caractère de la chaîne par n caractères; Par exemple, si la chaîne est "abc" et n = 1 , la sortie serait "BCD", si n = 2 , ce serait "CDE".

jusqu'à présent, j'ai écrit ce code xxx

néanmoins, si j'entraîne "xyz" et n = 1 , je reçois "yz { ", ce qui a du sens puisque le prochain caractère d'ASCII à" Z "est" {". Vous pouvez imaginer que pour un n plus élevé, ça empire; J'ai essayé de résoudre ce problème pour tout n à l'aide de MODULO, essayé de profiter du fait qu'il y a 26 lettres, mais je suis toujours incapable de trouver un incrément mathématique qui détecte lorsque la chaîne a été incrémenté plus loin que "Z", alors il "se remet" à "A".

Des recommandations? Merci d'avance.


5 commentaires

Vous recherchez modulo. par exemple: (ord (a) - 97)% 25 + 1


Cela a fonctionné, mais j'ai dû changer les 1 derniers pour un 97 et "A" dans "ORD (A)" pour "String [Caractéristique]". Je le clarifie au cas où quiconque trébuche sur cette même question.


Je sais que c'est probablement ridicule, mais je n'ai jamais aimé les approches de la carte entre des personnages et des entiers à l'aide d'Ord () et de Chr (). En ces jours d'ASCII presque universel, c'est probablement une bizarrerie personnelle ridicule; Mais j'ai grandi sur Ebcdic, où les lettres ne font pas de carte contiguë aux entiers, et certaines choses sont difficiles à secouer.


@Codingatty Oui, surtout avec la domination de l'UTF-8. Si vous le trouvez si offensant (ou si vous vous trouvez réellement sur une machine EBCDIC), vous pouvez simplement ajouter des conversions vers et depuis ASCII (ou UTF-8).


Oh, pas offensant du tout. La chose la plus importante est que cela fonctionne. Comme je l'ai dit, juste une bizarre personnelle ridicule sur ma part.Je n'ai pas touché Ebcdic depuis 30 ans, mais certaines choses vont juste profondément.


3 Réponses :


0
votes

briser le bas de sorte que des étapes individuelles avec des variables nommées précisent ce que vous traitez:

def shift_letter(letter, n):
    asciiValue = ord(letter)
    alphabetIndex = asciiValue - ord('a')
    alphabetIndex = (alphabetIndex + n) % 26
    asciiValue = alphabetIndex + ord('a')
    return chr(asciiValue)

string = list( input( "Insert a string, it will be codified: " ) )

n = int( input( "Insert an integer, each string's character will be increased by that number: " ) )

for characterIndex in range( len( string ) ):
    string[characterIndex] = shift_letter(string[characterIndex], n)

print( ''.join( string ) )


0 commentaires

1
votes

C'est une sorte de triche, mais voici l'approche que je prendrais: xxx

impressions: xxx

essentiellement, je numérise la chaîne convertir les caractères en position de la chaîne d'alphabet; ajouter 1 à chaque position; et reconstruire la chaîne de ces positions. La "triche" ajoute un "A" supplémentaire, donc un poste-25 (comptant de 0) 'z' se traduit par cette position supplémentaire-26 'A'.

Si cela vous offense, vous pouvez partir hors de l'extra 'A' et à la place, prenez simplement une autre passe à la liste des positions et lorsque vous voyez "26" (qui aurait dépassé la fin du lettre_list sans le 'a'), frappez-le jusqu'à zéro.

Ce n'est qu'une preuve de concept pour votre exemple; Pour soutenir un décalage arbitraire, vous allez étendre le letter_list pour l'alphabet complet et utilisez modulo sur l'entrée (par exemple, n = n% 26 ) pour assurer l'entrée. resté à portée.

En outre, j'utiliserais des expressions de liste à la place des boucles pour , mais que vous n'avez peut-être pas encore rencontré ceux-ci, alors j'ai utilisé plus explicite pour boucles au lieu de ci-dessus.


1 commentaires

Cela me semble inutilement complexe (et c'est un peu inefficace car il scanne la chaîne "ABCD ... une" chaîne pour chaque caractère de la chaîne d'entrée).



-1
votes

Voici la réponse modifiée des commentaires:

c = chr((ord(a) - 97) % 25 + 97)


1 commentaires

Ce n'est pas clair ce que vous faites ici: qu'est-ce que a ? Est-ce que cela signifie être appliqué après ajout n ? Sinon, où est n ajouté? Et % 25 est clairement faux.