Резюме: Основной вопрос здесь, как я обнаружил, заключается в том, можно ли передать блок кода в массив Ruby, который фактически сократит содержимое этого массива до другого, а не одиночное значение (как делает inject ). Короткий ответ - нет".
Я принимаю ответ, который говорит это. Спасибо Squeegy за отличную циклическую стратегию, позволяющую выделять полосы из массива.
Задача: Уменьшить элементы массива, не проходя через него явно.
Входные данные: Все целые числа от -10 до 10 (кроме 0) упорядочены в случайном порядке.
Желаемый результат: Массив, представляющий полосы положительных или отрицательных чисел. Например, -3 представляет три последовательных отрицательных числа. 2 представляет два последовательных положительных числа.
Пример сценария:
original_array = (-10..10).to_a.sort{rand(3)-1}
original_array.reject!{|i| i == 0} # remove zero
streaks = (-1..1).to_a # this is a placeholder.
# The streaks array will contain the output.
# Your code goes here, hopefully without looping through the array
puts "Original Array:"
puts original_array.join(",")
puts "Streaks:"
puts streaks.join(",")
puts "Streaks Sum:"
puts streaks.inject{|sum,n| sum + n}
Пример выходных данных:
Original Array:
3,-4,-6,1,-10,-5,7,-8,9,-3,-7,8,10,4,2,5,-2,6,-1,-9
Streaks:
1,-2,1,-2,1,-1,1,-2,5,-1,1,-2
Streaks Sum:
0
Original Array:
-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10
Streaks:
-10,10
Streaks Sum:
0
Обратите внимание на несколько вещей:
- Массив штрихов имеет чередующиеся положительные и отрицательные значения.
- Сумма массива elements streaks всегда равна 0 (как и сумма оригинала).
- Сумма абсолютных значений массива штрихов всегда равна 20.
Надеюсь, это понятно!
Редактировать: Я понимаю, что такие конструкции, как отклонить! на самом деле цикл по массиву в фоновом режиме. Я не исключаю зацикливание, потому что я подлый человек. Просто хочу узнать о языке. Если явная итерация необходима, это нормально.