Как найти список пар в массиве, используя ruby? - PullRequest
0 голосов
/ 27 мая 2019

Ввод :

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

Ответы [ 3 ]

3 голосов
/ 27 мая 2019

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

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]

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

1 голос
/ 27 мая 2019

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

  b = []
  a.uniq.each { |i| b.push(a.count(i)/2)}
  b.sum
1 голос
/ 27 мая 2019
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] Уменьшить значения хеша

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...