fork download
  1. factorial = Enumerator.new {|y|
  2. (1..Float::INFINITY).inject(1) {|acc, x| y << acc; acc * x}
  3. }
  4. f = ->(r, m, n) {
  5. a = r.map {|d| [d] * m}.flatten
  6. b = (0...a.size).each_cons(2).to_a.reverse
  7. if m == 1
  8. facts = factorial.take_while &n.method(:>=)
  9. q, r = n.divmod facts.last
  10. i, j, k = facts.size.tap {|s| break [-s, -s + 1, -s + q - 1]}
  11. a[i], a[k] = a[k], a[i] if a[i] && a[k]
  12. return a.reverse if !a[j]
  13. a[j..-1] = a[j..-1].sort.reverse
  14. n = r + 1
  15. end
  16. (n - 1).times.each_with_object(a) {
  17. i, j = b.find {|i, j| a[i] < a[j]}
  18. break a if not i
  19. k = a.rindex {|ak| a[i] < ak}
  20. a[i], a[k] = a[k], a[i]
  21. a[j...a.size] = a[j...a.size].reverse
  22. }
  23. }
  24. p f.(1..9, 1, 1)
  25. p f.(1..9, 1, 2)
  26. p f.(1..9, 1, 3)
  27. p f.(1..9, 1, 123456)
  28. p f.(1..9, 1, 234567)
  29. p f.(1..9, 1, 362880)
  30. p f.(1..4, 3, 1)
  31. p f.(1..4, 3, 2)
  32. p f.(1..4, 3, 3)
  33. p f.(1..4, 3, 123456)
  34. p f.(1..4, 3, 234567)
  35. p f.(1..4, 3, 369600)
Success #stdin #stdout 1.27s 8200KB
stdin
Standard input is empty
stdout
[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]