On Sun, 30 Jun 2013 16:06:35 +1000, Chris Angelico wrote: > So, here's a challenge: Come up with something really simple, and write > an insanely complicated - yet perfectly valid - way to achieve the same > thing. Bonus points for horribly abusing Python's clean syntax in the > process.
Here's a trivially stupid way to find the length of an iterable: sum(1 for obj in iterable) (except it isn't actually stupid, if the iterable is an iterator, and you don't mind consuming it to find out home many items it had). This leads to an obvious obfuscation: sum(('.' for obj in iterable), '').count('.') but sadly Python, in a rare case of protecting you from shooting your own foot off, doesn't allow this. Never mind, we can defeat the safety catch on sum() and complicate the code at the same time: sum(('.' for obj in iterable), type('S', (), {'__add__': lambda self, o: o})()).count('.') Obfuscated *and* quadratic performance. Do I win? Wait, I can beat that. Sorting is too trivial in Python: alist.sort() Pfft! Where's the challenge in that? Let's use an O(n!) algorithm for sorting -- yes, n factorial -- AND abuse a generator expression for its side effect. As a bonus, we use itertools, and just for the lulz, I obfuscate as many of the names as I can: from random import shuffle as OOO00O from itertools import takewhile as OO0O0O, count as O0OO0O OO0O00 = range(5) list(OO0O0O(lambda O: any(O[O0] < O[O0-1] for O0 in range(1, sum(('O' for O in O), type('O', (), {'__add__': lambda O0O, OO0: OO0})()).count('O'))), (OOO00O(OO0O00) or OO0O00 for O in O0OO0O())))[0] -- Steven -- http://mail.python.org/mailman/listinfo/python-list