My code runs in O(n log n) time and can deal with repeated digits. You converted it to something that takes exponential time and chokes on repeated digits.
(BTW, I just realized that my code can be made O(n), by replacing the default sort with a counting sort :-))
Hm, embarrassing, I just assumed you were doing the naive brute force. You're de-interleaving the digits with an order swap when the digits first start to differ.
It's nice to have this version for testing the faster, more complicated one from OP. I can attest that they indeed produce the same answers.
Two fixes:
- If you use `(Counter(digits)-Counter(e)).elements()` in the last line, you can support repeated digits.
- Reduce is `reduce(function, sequence[, initial]) -> value` so you should move the lambda to the first argument.
All in all I think this is a very nice, succinct use of Python. The combinatorial parts of `itertools` are extreamly handy :)
I don't mean this as a criticism -- as you are absolutely correct, your code does cut out a lot of the boilerplate and makes for a more compact function -- but I vastly prefer @cousin_it's function to yours in terms of readability. I think Python is a very pretty language but I always have a hard time reading Python code when it's heavy on the functional paradigms.