Note: This post was edited for clarity.
Many years ago, I was a Perl programmer. Then one day I became disillusioned at the progress of Perl 6 and decided to import this.
This seems to be a fairly common story for Perl to Python converts. While I haven’t looked back much, there are a number of things I really miss about perl
(lower case intentional). I miss having value types in a dynamic language, magical and ill-advised use of cryptocontext, and sometimes even pseudohashes because they were inexcusably weird. A language that supports so many ideas out of the box enables an extended learning curve that lasts for many years. “Perl itself is the game.”
Most of all I think I miss writing Perl poetry and JAPHs. Sadly, I didn’t keep any of those I wrote, and I’m not competent enough with the language anymore to write interesting ones. At the time I was intentionally distancing myself from a model that was largely implicit and based on archaic systems internals and moving to one that was (supposedly) explicit and simple.
After switching to Python as my primary language, I used the following email signature in a nod to this change in orientation (intended for Python 2):
print 'just another python hacker'
Recently I’ve been experimenting with writing JAPHs in Python. I think of these as “reformed JAPHs.” They accomplish the same purpose as programming exercises but in a more restricted context. In some ways they are more challenging. Creativity can be difficult in a narrowly defined landscape.
I have written a small series of reformed JAPHs which increase monotonically in complexity. Here is the first one, written in plain understandable Python 3.
import string
letters = string.ascii_lowercase + ' '
indices = [
9, 20, 18, 19, 26, 0, 13, 14, 19, 7, 4, 17, 26,
15, 24, 19, 7, 14, 13, 26, 7, 0, 2, 10, 4, 17
]
print(''.join(letters[i] for i in indices))
This is fairly simple. Instead of explicitly embedding the string 'just another python hacker'
in the program, we assemble it using the index of its letters in the string 'abcdefghijklmnopqrstuvwxyz '
. We then obfuscate through a series of minor measures:
- Instead of calling the print function, we
import sys
and make a call tosys.stdout.write
. - We assemble
string.lowercase + ' '
by joining together the character versions of its respective ordinal values (97 to 123 and 32). - We join together the integer indices using
'l'
and split that into a list. - We apply
'''
liberally and rely on the fact thatpython
concatenates adjacent strings.
Here’s the obfuscated version:
eval("__import__('''\x73''''''\x79''''''\x73''').sTdOuT".lower()
).write(''.join(map(lambda _:(list(map(chr,range(97,123)))+[chr(
32)])[int(_)],('''9l20l18l19''''''l26l0l13l14l19l7l4l17l26l15'''
'''l24l19l7l14l1''''''3l26l7l0l2l10l4l17''').split('l')))+'\n',)
We could certainly do more, but that’s where I left this one. Stay tuned for the next JAPH.