Короткая функция rot13 - [закрытый] Python

Я ищу короткую и прохладную функцию rot13 в Python ;-) Я записал эту функцию:

def rot13(s):
    chars = "abcdefghijklmnopqrstuvwxyz"
    trans = chars[13:]+chars[:13]
    rot_char = lambda c: trans[chars.find(c)] if chars.find(c)>-1 else c
    return ''.join( rot_char(c) for c in s ) 

Кто-либо может сделать его лучше? Например, поддержка символов верхнего регистра.

59
задан dreftymac 16 December 2017 в 20:01
поделиться

6 ответов

Вот решение maketrans / translate

import string
rot13 = string.maketrans( 
    "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", 
    "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
string.translate("Hello World!", rot13)
# 'Uryyb Jbeyq!'
76
ответ дан 24 November 2019 в 17:55
поделиться

Попробуйте следующее:

import codecs
codecs.encode("text to be rot13()'ed", "rot_13")
6
ответ дан 24 November 2019 в 17:55
поделиться

Функции maketrans и translate в модуле string удобны для такого рода вещей. Конечно, метод encode в ответе Эмбер еще удобнее для этого конкретного случая.

Вот общее решение:

import string

def make_rot_n(n):
 lc = string.ascii_lowercase
 uc = string.ascii_uppercase
 trans = string.maketrans(lc + uc,
                          lc[n:] + lc[:n] + uc[n:] + uc[:n])
 return lambda s: string.translate(s, trans)

rot13 = make_rot_n(13)

rot13('foobar')
# 'sbbone'
21
ответ дан 24 November 2019 в 17:55
поделиться

Это работает на Python 2 (но не на Python 3):

>>> 'foobar'.encode('rot13')
'sbbone'
65
ответ дан 24 November 2019 в 17:55
поделиться

Это очень просто:

>>> import codecs
>>> codecs.encode('foobar', 'rot_13')
'sbbone'
130
ответ дан 24 November 2019 в 17:55
поделиться

Из модуля this.py ( импортируйте этот ).

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print "".join([d.get(c, c) for c in s])
10
ответ дан 24 November 2019 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: