Как отсортировать массив по количеству уникальных групп, которые он может создать

Я не знаю, как правильно сформулировать вопрос, но я хочу следующее:

Скажем, там массив вроде

[1,1,1,1,2,2,2,3,3,3,4,4,5]

Как я могу отсортировать его, пока это не станет выходом:

[1,2,3,4,5,1,2,3,4,1,2,3,1]

Чтобы сделать вывод более читаемым:

[[1,2,3,4,5],[1,2,3,4],[1,2,3],[1]]

До сих пор я пришел к следующему:

array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
array.group_by{|n| n }.values.transpose.flatten

Но это вызывает ошибку из-за отсутствия одинакового количества чисел.

Помогает ли кто-нибудь?

Ответ 1

для этого потребовалось некоторое время, но вот что вам нужно:

array = [1,1,1,1,2,2,2,3,3,3,4,4,5]

a = array.group_by{|n| n }.values.sort_by(&:length).reverse

a.each{|q| (a[0].size-q.size).times{q<<nil}}

a.sort.transpose.flatten.compact

он производит:

  => [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1]

* у вас есть 3 числа двое

Ответ 2

▶ array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
▶ tap = array.group_by(&:to_i).values.sort do |i, j| 
▷   result = j.length <=> i.length
▷   result.zero? ? i <=> j : result
▷ end
▶ tap.map do |e| 
▷   e.fill nil, (e.length...tap.first.length)
▷ end.transpose.flatten.compact
#⇒ [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1]

Ответ 3

Придумал мой собственный ответ.

array = [1,1,1,1,2,2,2,3,3,3,4,4,5]

# group all the values in single array
a = array.group_by{|n| n }.values.sort{|a,b| b.size <=> a.size }

# fill every other space in the other subarrays with nil
a.each{|q| q.fill(nil, (a[0].size...q.size)) }

# transpose, flatten and remove all the nil values
a.transpose.flatten.compact

Если кто-нибудь знает "меньший" более читаемый ответ, пожалуйста, сообщите.

Ответ 4

Пусть arr будет вашим массивом. Тогда:

def transform(arr)
  a = arr.sort
  b = []
  until a.empty?
    u = a.uniq
    b << u
    a = a.difference(u)
  end
  b
end

Помощник Array#difference определяется в моем ответе здесь.

Попробуйте:

transform(arr)
  #=> [[1,2,3,4,5], [1,2,3,4], [1,2,3], [1]]