Задача на перевод символов в Rot13
Решаю задание на Codewars, где самому нужно сделать функцию, которая реализует шифр Rot13.
Его идея в следующем:
ROT13 — это простой шифр замены букв, который заменяет букву буквой, находящейся через 13 букв после неё в алфавите. Если в строку включены цифры или специальные символы, их следует вернуть в исходном виде. Смещать следует только буквы латинского/английского алфавита.
Мой код работает более чем с половиной значений, но я не понимаю, почему в некоторых моментах моя функция и перевод с помощью codecs.encode()
дают разные результаты.
Например, для 'test' выдаёт 'grfg' везде. А вот со строкой 'aA bB zZ 1234 *!?%' уже возникают различия:
- моя функция:
mM nN mM 1234 *!?%
- встроенная:
nN oO mM 1234 *!?%
Сам код:
alphabet = {1:'a', 2: 'b', 3: 'c', 4: 'c', 5: 'd', 6: 'e', 7: 'f', 8: 'g', 9: 'h', 10: 'i', 11: 'j', 12: 'k', 13: 'l', 14: 'm',15: 'n', 16: 'o', 17: 'p', 18: 'q', 19: 'r', 20: 's', 21: 't', 22: 'u', 23: 'v', 24: 'w', 25: 'x', 26: 'y', 27: 'z'}
def rot13(message):
mass = []
for n in message:
if n.isalpha():
for k, v in alphabet.items():
if n.lower() == alphabet[k]:
if n.islower():
if k + 13 <= 27:
mass.append(alphabet[k + 13])
break
else:
mass.append(alphabet[k - 13])
break
else:
if k + 13 <= 27:
mass.append(alphabet[k + 13].upper())
break
else:
mass.append(alphabet[k - 13].upper())
break
else:
mass.append(n)
return ''.join(mass)
print(rot13('aA bB zZ 1234 *!?%'))
Ответы (3 шт):
Ошибка в инициализации алфавита
alphabet = {1:'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm',14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z'}
Сама задача решается в одну строку. Все остальные строки - подготовка данных:
import string
src_lc = string.ascii_lowercase
src_uc = string.ascii_uppercase
dst_lc = src_lc[13:] + src_lc[:13]
dst_uc = src_uc[13:] + src_uc[:13]
src = src_lc + src_uc
dst = dst_lc + dst_uc
table = str.maketrans(src, dst)
print(input().translate(table))
def rot13(text, rot=13):
new_text = ''
for s in text: # Перебираем все символы
num = ord(s) # Порядковый номер символа
if ord('A') <= num <= ord('Z'); # Заглавные буквы A-Z
new = (num - ord('A') + rot) % 26 + ord('A')
elif ord('a') <= num <= ord('z'): # Строчные буквы a-z
new = (num - ord('a') + rot) % 26 + ord('a')
else: # Другие символы
new = num
new_text += chr(new)
return new_text
text = 'Hello, world!'
new_text = rot13(text)