Я пытаюсь сделать метод выбора акций на Ruby, но у меня есть некоторые проблемы в моем коде

[[1] * 4] * 3

или даже:

[[1, 1, 1, 1]] * 3

Создает список, который ссылается на внутренний [1,1,1,1] 3 раза - не три копии внутреннего списка, поэтому в любое время, когда вы изменяете список (в любом позиция), вы увидите изменение три раза.

Это то же самое, что и в этом примере:

>>> inner = [1,1,1,1]
>>> outer = [inner]*3
>>> outer
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> inner[0] = 5
>>> outer
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]

, где это, вероятно, немного менее удивительно.

1
задан OG Newbie 24 March 2019 в 04:37
поделиться

1 ответ

Другой вариант - нарезать массив, перебирая его для нахождения наилучшей прибыли:

res = ary.each_with_index.with_object([]) do |(buy_val, i), res|
  highest_val = ary[i..].max
  highest_idx = ary[i..].each_with_index.max[1] + i
  res << [highest_val - buy_val, i, highest_idx]
end.max_by(&:first)

#=> [12, 1, 4]

Где 12 - прибыль, 1 - индекс покупки, а 4 - индекс продаж.


Чтобы понять, как это работает, запустите эту расширенную версию, это стоит больше, чем любое письменное объяснение:

res = []
ary.each_with_index do |buy_val, i|
  p buy_val
  p ary[i..]
  p highest_val = ary[i..].max
  p highest_idx = ary[i..].each_with_index.max[1] + i
  res << [highest_val - buy_val, i, highest_idx]
  p '----'
end

res #=> [[0, 0, 0], [12, 1, 4], [9, 2, 4], [6, 3, 4], [0, 4, 4], [2, 5, 8], [4, 6, 8], [9, 7, 8], [0, 8, 8]]

Из стандартной библиотеки Ruby я использовал Enumerable # each_with_index , [118 ] Enumerable # each_with_object , Enumerable # max и Enumerable # max_by .


За получение индекса максимума, который я любезно украл у Чака ( https://stackoverflow.com/a/2149874 ), спасибо и +1. Я не искал лучшего варианта.

Согласно комментарию Кэри Свовеланд в связанном посте:

[..] a.index(a.max) вернет индекс первого, а a.each_with_index.max[1] вернет индекс последний [..]

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

0
ответ дан iGian 24 March 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: