짧은 rot13 함수-Python
Python에서 짧고 멋진 rot13 함수를 찾고 있습니다 ;-)이 함수를 작성했습니다.
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 )
누구든지 더 좋게 만들 수 있습니까? 예 : 대문자 지원.
다음은 maketrans / translate 솔루션입니다.
import string
rot13 = string.maketrans(
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
string.translate("Hello World!", rot13)
# 'Uryyb Jbeyq!'
매우 간단합니다.
>>> import codecs
>>> codecs.encode('foobar', 'rot_13')
'sbbone'
이것은 Python 2에서 작동하지만 Python 3에서는 작동하지 않습니다.
>>> 'foobar'.encode('rot13')
'sbbone'
모듈 의 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'
모듈 this.py
( import this
)에서.
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])
Python 3.1 string.translate
부터 string.maketrans
더 이상 존재하지 않습니다. 그러나 이러한 방법은 bytes
대신 사용할 수 있습니다 .
따라서 Paul Rubel의 솔루션에서 직접 영감을 얻은 최신 솔루션은 다음과 같습니다.
rot13 = bytes.maketrans(
b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
b"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM")
b'Hello world!'.translate(rot13)
및 내장 함수 를 사용 string
하여에서 bytes
또는 그 반대로 변환 할 수 있습니다 .encode
decode
이 시도:
import codecs
codecs.encode("text to be rot13()'ed", "rot_13")
python-3에서 str
@amber가 언급 한 -codec이 codecs
표준 라이브러리 로 이동했습니다 .
> import codecs
> codecs.encode('foo', 'rot13')
sbb
다음 함수 rot(s, n)
는 정수에 대해 s
ROT n
인코딩을 사용 하여 문자열 을 인코딩 n
하며 n
기본값은 13입니다. 대문자와 소문자가 모두 지원됩니다. n
26 개 이상의 값 또는 음수 값은 적절하게 처리됩니다. 예를 들어 27 개 위치 이동은 한 위치 이동과 같습니다. 디코딩은 invrot(s, n)
.
import string
def rot(s, n=13):
'''Encode string s with ROT-n, i.e., by shifting all letters n positions.
When n is not supplied, ROT-13 encoding is assumed.
'''
upper = string.ascii_uppercase
lower = string.ascii_lowercase
upper_start = ord(upper[0])
lower_start = ord(lower[0])
out = ''
for letter in s:
if letter in upper:
out += chr(upper_start + (ord(letter) - upper_start + n) % 26)
elif letter in lower:
out += chr(lower_start + (ord(letter) - lower_start + n) % 26)
else:
out += letter
return(out)
def invrot(s, n=13):
'''Decode a string s encoded with ROT-n-encoding
When n is not supplied, ROT-13 is assumed.
'''
return(rot(s, -n))
문자열을 rot13하는 한 줄 S
:
S.translate({a : a + (lambda x: 1 if x>=0 else -1)(77 - a) * 13 for a in range(65, 91)})
임의의 값의 경우 이와 같은 것이 2.x에서 작동합니다.
from string import ascii_uppercase as uc, ascii_lowercase as lc, maketrans
rotate = 13 # ROT13
rot = "".join([(x[:rotate][::-1] + x[rotate:][::-1])[::-1] for x in (uc,lc)])
def rot_func(text, encode=True):
ascii = uc + lc
src, trg = (ascii, rot) if encode else (rot, ascii)
trans = maketrans(src, trg)
return text.translate(trans)
text = "Text to ROT{}".format(rotate)
encode = rot_func(text)
decode = rot_func(encode, False)
이것은 대문자와 소문자에 대해 작동합니다. 당신이 얼마나 우아하다고 생각하는지 모르겠습니다.
def rot13(s):
rot=lambda x:chr(ord(x)+13) if chr(ord(x.lower())+13).isalpha()==True else chr(ord(x)-13)
s=[rot(i) for i in filter(lambda x:x!=',',map(str,s))]
return ''.join(s)
Walter 씨가 게시 한 원본 코드에서 대문자와 소문자를 번갈아 가며 대문자를 지원할 수 있습니다.
chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
대문자의 색인은 모두 짝수이고 소문자의 색인은 홀수입니다.
- A = 0 a = 1,
- B = 2, b = 3,
- C = 4, c = 4,
- ...
이 홀수 짝수 패턴을 사용하면 케이스에 대해 걱정할 필요없이 필요한 양을 안전하게 추가 할 수 있습니다.
trans = chars[26:] + chars[:26]
26을 더한 이유는 대문자로 인해 문자열이 두 배가 되었기 때문입니다. 그러나 이동은 여전히 알파벳에서 13 칸입니다.
전체 코드 :
def rot13(s):
chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
trans = chars[26:]+chars[:26]
rot_char = lambda c: trans[chars.find(c)] if chars.find(c) > -1 else c
return ''.join(rot_char(c) for c in s)
출력 (python 2.7로 테스트 됨) :
print rot13("Hello World!") --> Uryyb Jbeyq!
def rot13(s):
lower_chars = ''.join(chr(c) for c in range (97,123)) #ASCII a-z
upper_chars = ''.join(chr(c) for c in range (65,91)) #ASCII A-Z
lower_encode = lower_chars[13:] + lower_chars[:13] #shift 13 bytes
upper_encode = upper_chars[13:] + upper_chars[:13] #shift 13 bytes
output = "" #outputstring
for c in s:
if c in lower_chars:
output = output + lower_encode[lower_chars.find(c)]
elif c in upper_chars:
output = output + upper_encode[upper_chars.find(c)]
else:
output = output + c
return output
변속에 대한 또 다른 해결책. 이 코드는 다른 사람들이 rot13을 더 잘 이해하는 데 도움이 될 수 있습니다. 완전히 테스트하지 않았습니다.
from string import maketrans, lowercase, uppercase
def rot13(message):
lower = maketrans(lowercase, lowercase[13:] + lowercase[:13])
upper = maketrans(uppercase, uppercase[13:] + uppercase[:13])
return message.translate(lower).translate(upper)
재미있는 운동 ;-) 나는 다음과 같은 이유로 최고의 해결책을 가지고 있다고 생각합니다.
- 모듈 필요 없음, 내장 함수 만 사용-> 지원 중단 없음
- 하나의 라이너로 사용할 수 있습니다.
- ascii, 매핑 dicts / strings 등을 기반으로합니다.
Python 2 및 3 (아마도 Python 1) :
def rot13(s):
return ''.join([chr(ord(n) + (13 if 'Z' < n < 'n' or n < 'N' else -13)) if n.isalpha() else n for n in s])
def rot13_verbose(s):
x = []
for n in s:
if n.isalpha():
# 'n' is the 14th character in the alphabet so if a character is bigger we can subtract 13 to get rot13
ort = 13 if 'Z' < n < 'n' or n < 'N' else -13
x.append(chr(ord(n) + ort))
else:
x.append(n)
return ''.join(x)
# crazy .min version (99 characters) disclaimer: not pep8 compatible^
def r(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])
rot13
파이썬 으로 구현하는 가장 쉬운 방법에 대해 궁금해하기 시작했을 때이 게시물을 발견했습니다 . 내 목표는 다음과 같습니다.
- Python 2.7.6 및 3.3 모두에서 작동합니다.
- 대문자와 소문자를 모두 처리하십시오.
- 외부 라이브러리를 사용하지 마십시오.
이는 이러한 세 가지 요구 사항을 모두 충족합니다. 즉, 코드 골프 대회에서 우승하지 못할 것이라고 확신합니다.
def rot13(string):
CLEAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
ROT13 = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
TABLE = {x: y for x, y in zip(CLEAR, ROT13)}
return ''.join(map(lambda x: TABLE.get(x, x), string))
if __name__ == '__main__':
CLEAR = 'Hello, World!'
R13 = 'Uryyb, Jbeyq!'
r13 = rot13(CLEAR)
assert r13 == R13
clear = rot13(r13)
assert clear == CLEAR
이것은 룩업 테이블을 생성하고 룩업 테이블에없는 문자에 대해 원래 문자를 반환하는 방식으로 작동합니다.
최신 정보
I got to worrying about someone wanting to use this to encrypt an arbitrarily-large file (say, a few gigabytes of text). I don't know why they'd want to do this, but what if they did? So I rewrote it as a generator. Again, this has been tested in both Python 2.7.6 and 3.3.
def rot13(clear):
CLEAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
ROT13 = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
TABLE = {x: y for x, y in zip(CLEAR, ROT13)}
for c in clear:
yield TABLE.get(c, c)
if __name__ == '__main__':
CLEAR = 'Hello, World!'
R13 = 'Uryyb, Jbeyq!'
r13 = ''.join(rot13(CLEAR))
assert r13 == R13
clear = ''.join(rot13(r13))
assert clear == CLEAR
I couldn't leave this question here with out a single statement using the modulo operator.
def rot13(s):
return ''.join([chr(x.islower() and ((ord(x) - 84) % 26) + 97
or x.isupper() and ((ord(x) - 52) % 26) + 65
or ord(x))
for x in s])
This is not pythonic nor good practice, but it works!
>> rot13("Hello World!")
Uryyb Jbeyq!
You can also use this also
def n3bu1A(n):
o=""
key = {
'a':'n', 'b':'o', 'c':'p', 'd':'q', 'e':'r', 'f':'s', 'g':'t', 'h':'u',
'i':'v', 'j':'w', 'k':'x', 'l':'y', 'm':'z', 'n':'a', 'o':'b', 'p':'c',
'q':'d', 'r':'e', 's':'f', 't':'g', 'u':'h', 'v':'i', 'w':'j', 'x':'k',
'y':'l', 'z':'m', 'A':'N', 'B':'O', 'C':'P', 'D':'Q', 'E':'R', 'F':'S',
'G':'T', 'H':'U', 'I':'V', 'J':'W', 'K':'X', 'L':'Y', 'M':'Z', 'N':'A',
'O':'B', 'P':'C', 'Q':'D', 'R':'E', 'S':'F', 'T':'G', 'U':'H', 'V':'I',
'W':'J', 'X':'K', 'Y':'L', 'Z':'M'}
for x in n:
v = x in key.keys()
if v == True:
o += (key[x])
else:
o += x
return o
Yes = n3bu1A("N zhpu fvzcyre jnl gb fnl Guvf vf zl Zragbe!!")
print(Yes)
Short solution:
def rot13(text):
return "".join([x if ord(x) not in range(65, 91)+range(97, 123) else
chr(((ord(x)-97+13)%26)+97) if x.islower() else
chr(((ord(x)-65+13)%26)+65) for x in text])
참고URL : https://stackoverflow.com/questions/3269686/short-rot13-function-python
'Programing' 카테고리의 다른 글
Django : 모델 객체의 전체 집합을 단일 사전으로 변환 (0) | 2020.12.06 |
---|---|
AngularJS. (0) | 2020.12.06 |
사용자 정의 어셈블리 속성 (0) | 2020.12.05 |
node.js 대 sinatra 대 레일을 언제 사용합니까? (0) | 2020.12.05 |
IntellJ IDEA "기호를 확인할 수 없음"및 "방법을 확인할 수 없음" (0) | 2020.12.05 |