I could see that this problem was solvable by hand, but that’s no fun.
Instead I decided to implement it with a tree. Not the most efficient solution to be certain, especially the way I rolled it, but it was a fun exercise. I don’t get to play with trees often enough.
What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
def nth_lexical_permutation values, key = "", chain = "" chain = chain + key.to_s children = values.select { |i| i != key } $count -= 1 if children.size == 0 return chain if $count == 0 children.each do |i| result = nth_lexical_permutation children, i, chain return result if result.size > 0 end "" end $count = 1_000_000 set = (0..9).to_a puts nth_lexical_permutation(set)
Yep, there’s a global in there. It just made things easier. There are actually quite a few things I don’t like about this program. But it’s late. And I’m tired.