Мне нужно упаковать, если есть хотя бы два соседних числа, которые одинаковы в формате <number : number_of_occurrences >.

Это мой вклад:

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

И ожидаемый результат:

"2:3,3,4,3:2,2,4:2,5"

Пока что попробовал:

a = [1, 1, 1, 2, 2, 3, 2, 3, 4, 4, 5]
a.each_cons(2).any? do |s , t|
  if s == t

Если он равен, попробуйте счетчик, но это не работает.

5
Sajeesh Krishnan 24 Апр 2017 в 14:17

2 ответа

Вы можете chunk вместе, когда они равны, вы также можете slice массив различных элементов ({{X2 }} был добавлен в Ruby 2.2):

[2, 2, 2, 3, 4, 3, 3, 2, 4, 4, 5].slice_when { |a, b| a != b }.map do |ints|
  if ints.size == 1
    ints[0]
  else
    "#{ints[0]}:#{ints.size}"
  end
end.join(',')
# "2:3,3,4,3:2,2,4:2,5"

Это в основном дело вкуса, оба метода могут достичь совершенно одинаковых результатов, как select и reject.

3
Community 23 Май 2017 в 11:54
arr = [2, 2, 2, 3, 4, 3, 3, 2, 4, 4, 5]

arr.drop(1).each_with_object([[arr.first, 1]]) do |e,a|
  a.last.first == e ? a[-1][-1] += 1 : a << [e, 1]
end.map { |a| a.join(':') }.join(',')
  #=> "2:3,3:1,4:1,3:2,2:1,4:2,5:1"
1
Cary Swoveland 24 Апр 2017 в 20:51