My Web Log Book

Project Euler Problem 24

Used the algorithm on Wikipedia at http://en.wikipedia.org/wiki/Permutation#Lexicographical_order_generation. It’s a generic method that takes any arbitrary list and the desired permutation number k.

Problem Statement

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?

require "fixnum.rb" # Fixnum.factorial
def permutation(k, list)
  size = list.size
  factorial = (size-1).factorial
  result = []

  while result.size != size
    x = k / factorial
    x -= 1 if (k % factorial).zero?
    result << list.delete_at(x)
    k = k % factorial
    factorial = (list.size - 1).factorial
  end
  result
end

puts permutation(1000000, [0,1,2,3,4,5,6,7,8,9]).join