Подсчитайте, сколько раз значение между x и y присутствует в массиве

У меня есть массив из 200 случайных чисел от 1 до 100, и мне нужно найти, сколько чисел между x и y находится в массиве. Диапазон значений: 1–10, 11–20, 21–30 и т. д.

У меня есть что-то вроде этого

num_array = Array.new
200.times do
   num_array.push(rand(1...100))
end
print num_array
x = 1
y = 10
9.times do
  print num_array.count(x...y)   #<==
  x += 10
  y += 10
end

Я хочу, чтобы строка 9 (та, на которую указывает стрелка) сообщала, сколько раз числа между x и y появляются в массиве. Я знаю, как сделать это с большим количеством кода, но я действительно хочу сделать это с помощью одной или двух строк.

num_array.count(x...y) подсчитывает количество (x...y) (экземпляров Range.new(x,y, true)) в массиве.
Kimmo Lehto 31.10.2018 08:24
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
119
3

Ответы 3

Массив # count с аргументом и без блока проверяет, равны ли аргумент и текущий элемент. Вам нужно будет передать блок и провести некоторое сравнение, вы можете использовать Сопоставимый # между?, например:

num_array.count { |el| el.between?(x,y) }

Хорошее использование between?, но я бы упростил его до num_array.count { |el| el >= x && el <= y }

Ilya Konyukhov 31.10.2018 04:57

Вы можете использовать group_by и сгруппировать значения в массиве в соответствии с (n / 10) * 10, что дает вам соответствующие десять, например:

(83 / 10) * 10 = 80

p Array.new(200) { rand(1..100) }.group_by { |i| (i / 10) * 10 }
{ 70=>[73, 77, 79, 70, 72, 78, 72, 75, 74, 71, 79, 70, 75, 78, 76, 70, 77, 76, 76, 70],
  80=>[81, 85, 81, 86, 88, 87, 85, 86, 80, 80, 82, 88, 89, 87, 87, 89, 86, 84, 82],
  60=>[68, 60, 64, 63, 64, 66, 69, 68, 66, 68, 67, 69, 61, 69, 62, 61, 66, 67, 69, 64, 65, 66, 68, 68, 60, 64, 69],
  30=>[31, 39, 39, 37, 32, 35, 31, 39, 30, 39, 33, 31, 36, 38, 30, 30, 36, 32, 39, 32, 31],
  20=>[22, 27, 24, 27, 25, 20, 23, 25, 27, 23, 24, 26, 27, 25, 25, 28, 20],
  40=>[42, 44, 47, 43, 45, 45, 41, 48, 41, 42, 45, 46, 45, 48, 47, 46, 45],
  90=>[92, 97, 92, 94, 94, 95, 93, 98, 93, 94, 94, 92, 96, 94, 91, 95, 94, 93, 99, 92, 99, 96, 91, 97, 99, 96, 94, 99],
  10=>[17, 13, 16, 18, 13, 19, 14, 16, 14, 12, 10, 15, 13, 16, 14, 13],
  50=>[58, 50, 54, 58, 57, 52, 53, 53, 56, 57, 50, 52, 55],
  0=>[4, 3, 7, 4, 2, 5, 9, 1, 4, 7, 8, 7, 3, 7, 9, 6, 6, 9, 6],
  100=>[100, 100, 100] }

Применяя transform_values, он получает общее количество элементов в массиве для каждого элемента в хеше:

p Array.new(200) { rand(1..100) }.group_by { |i| (i / 10) * 10 }.transform_values(&:count)  
# {70=>20, 80=>19, 60=>27, 30=>21, 20=>17, 40=>17, 90=>28, 10=>16, 50=>13, 0=>19, 100=>3} 

Примечание 0 - это ключ для чисел от 1 до 10 (исключая).

Дополнительный: Вы также можете узнать, какие элементы находятся между x и y и сколько раз они повторяются,

arr = num_array.group_by(&:itself).inject({}) { |m, (k,v)| m[k] = v.count if k.between?(x,y); m }
=> {5=>2, 6=>3, 8=>3, 2=>3, 10=>2, 7=>1, 4=>2, 9=>1}

arr.count
=> 8 

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