import this
는 파이썬의 이스터 에그이다.
파이썬 쉘이나 스크립트로 import this
를 실행해보면
Tim Peters가 쓴 The Zen of Python
이라는 시가 출력된다.
소스코드를 따라가 보면 단순히 문자열을 출력하는 게 아니라
ROT13으로 암호화된 문자열을 복호화해서 출력하는 코드 임을 알 수 있다.
chr()
과 ord()
는 아스키코드와 유니코드에 관련된 파이썬 내장함수이다.
chr(정수)
는 정수에 해당하는 아스키/유니코드 문자를 반환하고
ord(문자)
는 문자에 해당하는 아스키/유니코드 정수를 반환한다.
import this
# 여기서부터 소스코드
# ROT13 암호화된 문자열 s
s = """Gur Mra bs Clguba, ol Gvz Crgref
Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""
d = {} # 빈 딕셔너리 d 생성
for c in (65, 97): # (65, 97) 튜플 안에서, 65는 아스키코드로 'A', 97은 'a' 이다.
for i in range(26): # 0에서 25까지
d[chr(i + c)] = chr((i + 13) % 26 + c) # ROT13
# 알파벳 대문자 A를 ROT13으로 복호화하면 N이 됨
# 딕셔너리 d에 key(암호화된 문자): value(복호화된 문자)로 저장
# d[chr(0+65)] = chr((0+13) % 26 + 65) => d['A'] = 'N'
# d[chr(1+65)] = chr((1+13) % 26 + 65) => d['B'] = 'O'
# ...
# d['Z'] = 'M'
# 이하 소문자
# d[chr(0+97)] = chr((0+13) % 26 + 97) => d['a'] = 'n'
# d[chr(1+97)] = chr((1+13) % 26 + 97) => d['b'] = 'o'
# ...
# d['z'] = 'm'
# 위의 문자열 s의 모든 문자 c에 대해 딕셔너리 d의 키로 나온 복호화된 문자를 전부 리스트 컴프리헨션
# 그 리스트를 join으로 붙여서 복호화된 문자열로 만들고 출력
# 빈칸(" ")은 딕셔너리 d의 키에 없으므로 d.get(c, c)에 의해 None이 아니고 빈칸 그대로 반환됨
print("".join([d.get(c, c) for c in s]))