Note: This post was updated to work with Python 3.12. It may not work with different versions.
No series of JAPHs would be complete without ROT13. This is the example through which aspiring Perl programmers learn to use tr
and its synonym y
. In Perl the basic ROT13 JAPH starts as:
$foo = 'whfg nabgure crey unpxre';
$foo =~ y/a-z/n-za-m/;
print $foo;
Python has nothing quite so elegant in its default namespace. However, this does give us the opportunity to explore a little used aspect of strings: the translate method. If we construct a dictionary of ordinals we can accomplish the same thing with a touch more effort.
import string
table = {
ord(x): ord(y) for x, y in zip(
string.ascii_lowercase,
string.ascii_lowercase[13:] + string.ascii_lowercase
)
}
print('whfg nabgure clguba unpxre'.translate(table))
We obfuscate the construction of this translation dictionary and, for added measure, use getattr
to find the print
function off of __builtins__
. This will likely only work in Python 3.2, since the order of attributes on __builtins__
matters.
getattr(vars()[list(filter(lambda _:'\x5f\x62'in _,dir
()))[0]], dir(vars()[list(filter(lambda _:'\x5f\x62'in
_, dir()))[0]])[list(filter(lambda _:_ [1].startswith(
'\x70\x72'),enumerate(dir(vars()[list(filter(lambda _:
'\x5f\x62'in _,dir()))[0]]))))[0][0]])(getattr('whfg '
+'''nabgure clguba unpxre''', dir('0o52')[0o116])({ _:
(_-0o124) %0o32 +0o141 for _ in range(0o141, 0o173)}))