Advertisement
Guest User

Untitled

a guest
Nov 21st, 2014
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. array = [211, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200]
  2.  
  3. array = [211, 200, 199, 198, 197, 196 ... ]
  4.  
  5. def change_em(arr)
  6. dup_indices = arr.each_index.group_by { |i| arr[i] }.values.flat_map { |a| a.drop(1) }
  7. puts "dup_indices = #{dup_indices}"
  8. last = arr.first + 1
  9. arr.each_index.map { |i| last = dup_indices.include?(i) ? last-1 : arr[i] }
  10. end
  11.  
  12. change_em [10, 8, 5, 5, 7]
  13. #=> dup_indices = [3]
  14. #=> [10, 8, 5, 4, 7]
  15. change_em [10, 8, 7, 5, 5]
  16. #=> dup_indices = [4]
  17. #=> [10, 8, 7, 5, 4]
  18. change_em [211, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 196]
  19. #=> dup_indices = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
  20. #=> [211, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 196]
  21.  
  22. def f(arr, dups = [])
  23. return deduct_dups(dups) if arr.empty?
  24. if arr[0] != arr[1] # Not duplicates
  25. if dups.empty? # No duplicates to insert
  26. [arr[0]] + f(arr[1..-1])
  27. else # Insert duplicates
  28. deduct_dups(dups) + f(arr[1..-1])
  29. end
  30. else # Duplicate found, add the first element to the dup array
  31. f(arr[1..-1], dups.push(arr[0]))
  32. end
  33. end
  34.  
  35. def deduct_dups(dups)
  36. return [] if dups.empty?
  37. (dups.first - dups.length..dups.first).to_a.reverse
  38. end
  39.  
  40. p f [211, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200]
  41. # => [211, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190]
  42.  
  43. p f [10, 8, 5, 5, 7].sort.reverse
  44. # => [10, 8, 5, 4, 7]
  45.  
  46. p f [9, 6, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, 1].sort.reverse
  47. # => [9, 6, 5, 5, 4, 4, 3, 3, 2, 1, 2, 1, 1]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement