factorial = Enumerator.new {|y| (1..Float::INFINITY).inject(1) {|acc, x| y << acc; acc * x} } f = ->(r, m, n) { a = r.map {|d| [d] * m}.flatten b = (0...a.size).each_cons(2).to_a.reverse if m == 1 facts = factorial.take_while &n.method(:>=) q, r = n.divmod facts.last i, j, k = facts.size.tap {|s| break [-s, -s + 1, -s + q - 1]} a[i], a[k] = a[k], a[i] if a[i] && a[k] return a.reverse if !a[j] a[j..-1] = a[j..-1].sort.reverse n = r + 1 end (n - 1).times.each_with_object(a) { i, j = b.find {|i, j| a[i] < a[j]} break a if not i k = a.rindex {|ak| a[i] < ak} a[i], a[k] = a[k], a[i] a[j...a.size] = a[j...a.size].reverse } } 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]