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. if m == 1
  7. facts = factorial.take(a.size + 1)
  8. return facts.last < n ? a.reverse : facts.reverse.each_cons(2).each_with_object(a) {
  9. |(x, y), acc| acc << acc.delete_at((n - 1) % x / y)
  10. }
  11. end
  12. b = (0...a.size).each_cons(2).to_a.reverse
  13. (n - 1).times.each_with_object(a) {
  14. i, j = b.find {|i, j| a[i] < a[j]}
  15. break a if not i
  16. k = a.rindex {|ak| a[i] < ak}
  17. a[i], a[k] = a[k], a[i]
  18. a[j..-1] = a[j..-1].reverse
  19. }
  20. }
  21. p f.(1..9, 1, 1)
  22. p f.(1..9, 1, 2)
  23. p f.(1..9, 1, 3)
  24. p f.(1..9, 1, 123456)
  25. p f.(1..9, 1, 234567)
  26. p f.(1..9, 1, 362880)
  27. p f.(1..4, 3, 1)
  28. p f.(1..4, 3, 2)
  29. p f.(1..4, 3, 3)
  30. p f.(1..4, 3, 123456)
  31. p f.(1..4, 3, 234567)
  32. p f.(1..4, 3, 369600)
  33.  
Success #stdin #stdout 1.18s 8060KB
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]