Правильный способ сделать массив из целочисленного деления в Ruby - PullRequest
0 голосов
/ 22 ноября 2018

tl; dr Я хочу сделать массив из деления на 5 результатов:

20 => [5,5,5,5]
16 => [5,5,5,1]
7  => [5,2]

Моя текущая реализация проста, но слишком велика.Как я могу сделать это проще и короче?

  max_count = 5
  total_count = input_value

  count_array = []
  div = total_count / max_count
  mod = total_count % max_count
  div.times { count_array << max_count }
  count_array << mod unless mod == 0

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

Как насчет этого?

[20].tap{|a| a.push(5, a.pop - 5) while a.last > 5} # => [5, 5, 5, 5]
[16].tap{|a| a.push(5, a.pop - 5) while a.last > 5} # => [5, 5, 5, 1]
[7] .tap{|a| a.push(5, a.pop - 5) while a.last > 5} # => [5, 2]
0 голосов
/ 23 ноября 2018

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

d = 5
n = 24
Array.new(n/d){d}.tap{ |a| a << n%d if (n%d).nonzero? }
#=> [5, 5, 5, 5, 4]
0 голосов
/ 23 ноября 2018

Вы также можете попробовать это.

max=5
num=48
q, r=num.divmod(max) # => [9, 3]
Array.new.fill(max, 0, q).push(r.nonzero?).compact
# => [5, 5, 5, 5, 5, 5, 5, 5, 5, 3]
0 голосов
/ 23 ноября 2018
  1. Вам не нужно total_count.
  2. div.times { count_array << max_count } is [max_count] * count_array
  3. Используя сплат, мы можем еще больше упростить его

max_count = 5

[*[max_count] * (input_value / max_count), input_value % max_count] - [0]

В качестве альтернативы, используя divmod

max_count = 5

n, mod = input_value.divmod(max_count)
[*[max_count] * n, mod] - [0]

Последняя строка также может быть записана как:

(Array.new(n) { max_count } << mod) - [0]

или как предложил Стефанв комментарии, используя Числовой # ненулевой? :

Array.new(n, max_count).push(*mod.nonzero?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...