f = ->(r, m, n) { fact = ->n {(1..n).inject(:*) || 1} a = r.map {|d| [d] * m}.flatten x = fact.(a.size) / (fact.(m) ** r.size) return a.reverse if x < n a.size.times.each_with_object([]) {|_, acc| y = x.to_f / a.size acc << a.delete_at((n - 1) % x / y) x = (a.count(acc.last) + 1) * y n -= a.count(&acc.last.method(:>)) * y } } p f.(1..9, 1, 1) p f.(1..9, 1, 2) p f.(1..9, 1, 3) p f.(1..9, 1, 123456) p f.(1..9, 1, 234567) p f.(1..9, 1, 362880) p f.(1..4, 3, 1) p f.(1..4, 3, 2) p f.(1..4, 3, 3) p f.(1..4, 3, 123456) p f.(1..4, 3, 234567) p f.(1..4, 3, 369600)
Standard input is empty
[1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 9, 8] [1, 2, 3, 4, 5, 6, 8, 7, 9] [4, 1, 6, 5, 8, 9, 7, 3, 2] [6, 8, 4, 7, 5, 3, 2, 1, 9] [9, 8, 7, 6, 5, 4, 3, 2, 1] [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] [1, 1, 1, 2, 2, 2, 3, 3, 4, 3, 4, 4] [1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 3, 4] [2, 2, 2, 3, 3, 1, 4, 3, 4, 1, 1, 4] [3, 2, 4, 4, 2, 4, 3, 3, 1, 1, 1, 2] [4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1]