A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are:
012 021 102 120 201 210
What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
I tried to solve this by thinking and failed to be hones. So we implement a generator and get the millionth element.
from collections import deque
def permutation_generator(xs):
if not xs:
yield deque()
r = []
for i in range(len(xs)):
x = xs[i]
ys = permutation_generator(xs[:i] + xs[i+1:])
for y in ys:
y.appendleft(x)
yield y
raise StopIteration
assert(list(map(lambda s: "".join(s), permutation_generator("012"))) == ['012', '021', '102', '120', '201', '210'])
All right, now we reuse the function to get the nth element from problem 7 and give ourselves a solution.
def get_nth(generator, n):
import itertools
return next(itertools.islice(generator, n - 1, n))
ps = permutation_generator("0123456789")
s = int("".join(get_nth(ps, 1000000)))
assert(s == 2783915460)
print(s)