[[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]]
, где это, вероятно, немного менее удивительно.
Другой вариант - нарезать массив, перебирая его для нахождения наилучшей прибыли:
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 .
Согласно комментарию Кэри Свовеланд в связанном посте:
[..]
blockquote>a.index(a.max)
вернет индекс первого, аa.each_with_index.max[1]
вернет индекс последний [..]Итак, возможно, вы захотите использовать первый вариант, чтобы сократить время между покупкой и продажей.