Как перебирать алфавитный указатель в Python?

Вопрос: Как в АНБ отличить экстраверта от интроверта? Va gur ryringbef, gur rkgebireg ybbxf ng gur BGURE thl'f ​​fubrf.

Я нашел эту шутку на USENET, но суть ее зашифрована. Может, расшифруешь? Согласно Википедии, ROT13 (http://en.wikipedia.org/wiki/ROT13) часто используется для сокрытия шуток в USENET.

Подсказка: для этой задачи вы должны заменять только символы. Не пробелы, знаки препинания, цифры и т. Д. Примеры тестов:

Мой код:

def rot13(message):
    solved = ""
    for i in message:
        if i == "," or "-" or "/" or "." or "1" or "2" or "3" or "4" or "5" or "6" or "7" or "8" or "9":
            solved += i
        else:
            decipher = chr(ord(i)+13)
            solved += decipher
    return solved.upper()

проблема, которую мне нужно решить. Каждый раз, когда я пытаюсь изменить букву после 13-го индекса, я получаю пробел вместо буквы. Например, когда я помещаю букву «u» в функцию, она дает мне «_», но я хочу «h». Как циклически перемещаться по алфавиту в Python вместо того, чтобы просто заканчивать на 26-м индексе


person Addi    schedule 08.01.2020    source источник
comment
Вы не можете сказать if i == a or b or c or d, но можете сказать if i==a or i==b or ... или if i in (a,b,c,d):.   -  person Mark Tolonen    schedule 08.01.2020
comment
Вы утверждаете, когда я помещаю букву u в функцию, которая дает мне _, но я хочу h. Но ваш код этого не делает. rot13("u") возвращает "U", потому что ваш тест всегда проходит успешно.   -  person ShadowRanger    schedule 08.01.2020
comment
@ShadowRanger Это одна ошибка, но указанный дубликат не является ответом на весь вопрос. Однако есть много дубликатов о том, как обращаться с ROT13.   -  person Mark Tolonen    schedule 08.01.2020
comment
@MarkTolonen: Верно. Ищем тот из множества вариантов прямо сейчас. :-)   -  person ShadowRanger    schedule 08.01.2020
comment
stackoverflow.com/q/3269686/235698   -  person Mark Tolonen    schedule 08.01.2020


Ответы (2)


Попробуй это:

import string

letters = string.ascii_letters
letters += letters  # now you can easily go for 'z' + 26, etc.

print ''.join( [letters[letters.find(k) + 13] if k in letters else k for k in msg] )

выход:

in tHE ELEvAtors, tHE ExtrovErt LooKs At tHE OTheR Guy's sHoEs
person lenik    schedule 08.01.2020

Вам нужно использовать оператор modulo: %, чтобы "обернуть" алфавит.

(ord(i) + 13) % 26 = # value between 0 and 25, the substituted letter index

Арифметика по модулю очень важна в криптографии и широко используется.

person mgrollins    schedule 08.01.2020