Руби, делая число отрицательным

Это, вероятно, супер базовый, но я попробовал достаточно вещей, которые не смогли достичь..

Я хочу изменить номер на его отрицательную версию.

answer = []
array = [3, 5, 2, 19, 2, 1]

array.each.with_index do |x, i|

   if x > array[i+1]
      answer << array[i] * -1
   else x =< array[i+1]
      answer << array[i] 
   end
 end
=> the answer I want is [-5] for when 'true' but I'm getting [5]

Я также попытался создать новый 'negarray' со всеми эквивалентными отрицательными числами как 'массив'

answer = []
array = [3, 5, 2, 19, 2, 1]
negarray = [-3, -5, -2, -19, -2, -1]

=> again, getting [5], and not the [-5] I want. 

Ура!

3 ответа

Решение

В актуальном варианте вопросы неясны.

Если вы имеете в виду с

Я хочу изменить номер на его отрицательную версию.

что вы хотите всегда отрицательное число, то вы можете попробовать:

answer = []
array = [3, 5, 6, 19, 2, 1]

array.each do |x|
   if x > 0
      answer << x * -1
   else
      answer << x 
   end
 end

 p answer

или же

array.each do |x|
   answer << if x > 0
       x * -1
   else
       x 
   end
 end

или с троичным оператором:

array.each do |x|
   answer << (x > 0 ? -x : x)
 end

Или короче и больше ruby-esk (используя троичный оператор):

 array = [3, 5, 6, 19, 2, -1]
 answer = array.map { |n| n > 0 ? -n : n }

Если вы предпочитаете дольше, если:

 answer = array.map do |n| 
  if n > 0 
    -n 
  else
    n 
  end
 end

Если вы не хотите использовать какую-либо if-структуру, то вы можете использовать отрицательный abs-метод:

 answer = array.map { |n| -n.abs }

Со следующей строкой

if x > array[i+1]

Вы в основном говорите, если элемент в положении i больше, чем позиция в i+1хочешь сделать это негативным. Проблема в том, что 5 меньше, чем следующий элемент 6 и по этой причине это не отрицается.

Давайте исправим ваш код и используем map способ упростить это:

out = array.map.with_index do |x, i|
   (array[i+1].nil? || x > array[i+1]) ? x : x*-1
end
# [-3, -5, -6, 19, 2, 1]

Если вы хотите получить отрицательное значение второго элемента массива по индексу 1, сделайте следующее

answer << array[1] * -1

Чтобы изменить ВСЕ значения массива на отрицательные числа, используйте следующее

answer = array.map { |n| -n }
Другие вопросы по тегам