Вход:
a = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]
Как перечислить количество пар в массиве.
Выход:
9
Описание
#no 1(1 pair)
#no 3(1 pair)
#no 4(2 pairs)
#no 5(3 pairs)
#no 6(2 pairs)
#so total 9 pairs
Все комбинации или 2 элемента.
Если вы найдете это полезным. stackoverflow.com/questions/35585399/…
добавлен ожидаемый результат
Заголовок запрашивает количество уникальных пар. В теле вы запрашиваете список таких пар. Что это? Пожалуйста, покажите 9 уникальных пар, которые являются желаемым результатом для вашего примера. Например, вы говорите «#нет 5 (3 пары)». Что это за 3 пары?
[1, 1, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6] в этом массиве вы можете увидеть список пар
arr = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]
hash = Hash.new(0)
arr.each { |e| hash[e] += 1 }
hash.values.reduce(0) { |s, n| s += n / 2 } // => 9
Поскольку, насколько я могу судить, вы в основном удаляете целые числа в тот момент, когда они были объединены в пару, так что технически это просто целочисленное деление на два.
[1] Как подсчитать одинаковые строковые элементы в массиве Ruby
Хороший ответ. OP отредактировал заголовок, поэтому общее число (9) больше не запрашивается, поэтому вы можете написать arr.each_with_object(Hash.new(0)) { |e,hash| hash[e] += 1 }.transform_values { |v| v/2 } #=> {4=>2, 5=>3, 6=>2, 1=>1, 3=>1}
.
Я так делал, работает
b = []
a.uniq.each { |i| b.push(a.count(i)/2)}
b.sum
Обратите внимание, что count
должен каждый раз проходить весь массив, что делает это решение довольно неэффективным.
Вот еще один вариант:
a.group_by(&:itself).transform_values{ |v| v.size / 2 }.values.sum
#=> 9
Сначала сгруппируйте элементы по значению:
a.group_by(&:itself) #=> {4=>[4, 4, 4, 4, 4], 5=>[5, 5, 5, 5, 5, 5], 6=>[6, 6, 6, 6, 6], 1=>[1, 1], 3=>[3, 3]}
Затем преобразуем ключи в количество пар:
a.group_by(&:itself).transform_values{ |v| v.size / 2 } #=> {4=>2, 5=>3, 6=>2, 1=>1, 3=>1}
Итак, получаем значения хеша:
a.group_by(&:itself).transform_values{ |v| v.size / 2 }.values #=> [2, 3, 2, 1, 1]
Наконец, суммируйте значения, что является первой строкой кода, опубликованного выше.
Какие пары рассматриваете? Все комбинации из 2 элементов? Или просто соседние пары? Кроме того, в вашей теме написано «уникальные пары», но в вашем вопросе не упоминается уникальность. Что это?