Ruby - как нарезать массив и суммировать его элементы по условию - PullRequest
0 голосов
/ 05 июня 2019

Я не могу найти способ добиться следующего:

  • с учетом массива целых чисел
  • умножать каждое второе число
  • суммировать все целые числа

Я пытался использовать Enumerble#each_slice, но до сих пор не знаю, как вызвать Array#sum для модифицированной части массива:

input =  [6, 8, 2, 4, 4, 4, 5, 5, 0]
input.each_slice(2) {|slice| p slice }
#=> 
[6, 8]
[2, 4]
[4, 4]
[5, 5]
[0]

Теперь я хотел бы умножить каждыйпоследний элемент в каждой паре ( условие может быть применено перед умножением):

[6, 8] => 8 *2
[2, 4] => 4 *2
[4, 4] => 4 *2
[5, 5] => 5 *2
[0]

и суммируйте все числа исходного массива с умножением каждого второго числа:

[6, 16, 2, 8, 4, 8, 5, 10, 0].sum

Есть идеи?Спасибо.

Ответы [ 6 ]

2 голосов
/ 05 июня 2019

Еще одна опция, использующая Enumerable # each_slice и Enumerable # sum , которая принимает блок:

input.each_slice(2).sum { |a, b| a + 2* (b || 0) }
2 голосов
/ 05 июня 2019

Вот способ сделать это, «умножить каждый второй элемент и затем сложить все»

input =  [6, 8, 2, 4, 4, 4, 5, 5, 0]

input.map.with_index{|elem, idx| idx.odd? ? elem * 2 : elem} # => [6, 16, 2, 8, 4, 8, 5, 10, 0]
     .sum # => 59

Небольшое изменение этого, без использования индекса (который может успокоить рецензента):

input.zip([false, true].cycle).
      map {|elem, is_second| is_second ? elem * 2 : elem}.
      sum
1 голос
/ 05 июня 2019

Решение, к которому я пришел, - улучшенная версия @ iGian's:

digits = [6, 8, 2, 4, 4, 4, 5, 5, 0]
digits.each_slice(2).sum { |first, last=0| first + my_custom_function(last) }

def my_custom_function(digit)
  digit *= 2
  digit -= 9 if digit > 9
  digit
end

Надеюсь, это поможет.

1 голос
/ 05 июня 2019

Чтобы добавить другой вариант:

input
  .zip([1, 2].cycle)
  .map { |a| a.inject(:*) }
  .sum
0 голосов
/ 05 июня 2019

просто для удовольствия, придерживаясь каждой_слайса

input.each_slice(2).map { |s| s[1] ? [s[0], s[1] * 2] : s[0] }.flatten

# => [6, 16, 2, 8, 4, 8, 5, 10, 0] 

input.each_slice(2).map { |s| s[1] ? [s[0], s[1] * 2] : s[0] }.flatten.sum
# => 59
0 голосов
/ 05 июня 2019
bool = true 
input.map do |e| 
    bool ^= true
    bool ? e * 2 : e
end.sum

Мне нравится, @Sergio Tulentsev лучше отвечает, и этот ответ может не использовать индекс, но является еще одной переменной для побочных эффектов.

Что я хочу знать, есть ли способ дать карту (булево на своем пути?Я видел нечто подобное на другом языке.

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