Как найти список пар в массиве с помощью ruby?

Вход:

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 элементов? Или просто соседние пары? Кроме того, в вашей теме написано «уникальные пары», но в вашем вопросе не упоминается уникальность. Что это?

lurker 27.05.2019 15:19

Все комбинации или 2 элемента.

Rajkumar Ulaganadhan 27.05.2019 15:21

Если вы найдете это полезным. stackoverflow.com/questions/35585399/…

Junaid Ali 27.05.2019 15:29

добавлен ожидаемый результат

Rajkumar Ulaganadhan 27.05.2019 15:41

Заголовок запрашивает количество уникальных пар. В теле вы запрашиваете список таких пар. Что это? Пожалуйста, покажите 9 уникальных пар, которые являются желаемым результатом для вашего примера. Например, вы говорите «#нет 5 (3 пары)». Что это за 3 пары?

Cary Swoveland 27.05.2019 17:23

[1, 1, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6] в этом массиве вы можете увидеть список пар

Rajkumar Ulaganadhan 28.05.2019 07:45
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
2
6
1 341
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

[2] Уменьшить хеш-значения

Хороший ответ. 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}.

Cary Swoveland 28.05.2019 09:31

Я так делал, работает

  b = []
  a.uniq.each { |i| b.push(a.count(i)/2)}
  b.sum

Обратите внимание, что count должен каждый раз проходить весь массив, что делает это решение довольно неэффективным.

Stefan 27.05.2019 16:30
Ответ принят как подходящий

Вот еще один вариант:

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]

Наконец, суммируйте значения, что является первой строкой кода, опубликованного выше.

Другие вопросы по теме