Guest User

Untitled

a guest
Oct 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.16 KB | None | 0 0
  1. def rank(s)
  2. if s.length == 1
  3. return 0
  4. else
  5. multiplier = s.split("").sort.index(s[0].chr)
  6. subcombos = (1..(s.length-1)).reduce { |a,b| a * b }
  7. return (multiplier * subcombos) + rank(s.slice(1..-1))
  8. end
  9. end
  10.  
  11. def unrank(n, s)
  12. sorted = s.split("").sort
  13. if n == 0
  14. return sorted.join("")
  15. end
  16. subcombos = (1..(s.length-1)).reduce { |a,b| a * b }
  17. index = n/subcombos
  18. char = sorted[index]
  19. sorted.delete_at(index)
  20. return char + unrank(n-(index*subcombos), sorted.join(""))
  21. end
  22.  
  23. # Sort of an ad hoc test framework.
  24. rank_tests = [["abf", 0],
  25. ["afb", 1],
  26. ["baf", 2],
  27. ["bfa", 3],
  28. ["fab", 4],
  29. ["fba", 5]]
  30.  
  31. unrank_tests = [[0, "abf"],
  32. [1, "afb"],
  33. [2, "baf"],
  34. [3, "bfa"],
  35. [4, "fab"],
  36. [5, "fba"]]
  37.  
  38. passed = 0
  39. rank_tests.each do |test, expected|
  40. if rank(test) != expected
  41. puts "Failed on input: #{test}"
  42. else
  43. passed += 1
  44. end
  45. end
  46. unrank_tests.each do |test, expected|
  47. if unrank(test, "abf") != expected
  48. puts "Failed on input: #{test}"
  49. else
  50. passed += 1
  51. end
  52. end
  53. puts "Passed #{passed} tests."
Add Comment
Please, Sign In to add comment