Приветствие, я пытаюсь решить следующую загадку:
У меня есть список линейных диапазонов, которые представляют один большой диапазон.
X'
100 200 300 400 500 600 700 | 900 (X)
|----------|----------|----------|--------+----------|
0 | 100 (Y)
Y'
X состоит из следующих диапазонов ( четные и круглые числа являются просто примерами для простоты понимания, они могут быть любыми, без пропорций здесь ):
- от 100 до 200
- от 300 до 400
- от 500 до 600
- от 700 до 900
С другой стороны, у Y есть только один диапазон:
Оба X и Y имеют одинаковую длину, только разные единицы. Допустим, один - доллары, а другой - проценты (или любые другие аналогично не связанные единицы). Итак, Y'0 == X'100 и Y'100 == X'900.
Вопрос : Для любой точки в Y, что является эквивалентной точкой в X и наоборот, для данной точки в X - что это за Y?
Это типичная математическая задача? У него есть имя? Все, что меня направит в правильном направлении, поможет.
Спасибо.
Вот решение, основанное на ответе Игоря Кривокона . Мне пришлось убрать умножение на два, чтобы оно заработало.
input_range = [
[100, 200],
[300, 400],
[500, 600],
[700, 800]
]
range_sum = 0
lookup_list = []
input_range.each do |range_start, range_end|
lookup_list.push [ range_start, range_sum ]
range_sum += range_end - range_start
end
def get_percent(value, lookup_list, range_sum)
result = 0
lookup_list.reverse.each do |range_start, cummulative_sum|
if value >= range_start
result = value + cummulative_sum - range_start
break
end
end
return result.to_f / range_sum.to_f
end
def get_value(percent, lookup_list, range_sum)
result = 0
value = range_sum * percent
lookup_list.reverse.each do |range_start, cummulative_sum|
if value >= cummulative_sum
result = value - cummulative_sum + range_start
break
end
end
return result.to_f
end
puts "Input range: #{input_range.inspect}"
puts "Continous range sum: #{range_sum}"
puts "Lookup list: #{lookup_list.inspect}"
input_range.each do |range|
range.each do |start_or_end|
puts "#{start_or_end} is at " + get_percent(start_or_end, lookup_list, range_sum).to_s
end
end
[ 0, 0.25, 0.5, 0.75, 1 ].each do |percent|
puts "#{percent} is at " + get_value(percent, lookup_list, range_sum).to_s
end
$> ruby range.rb
Input range: [[100, 200], [300, 400], [500, 600], [700, 800]]
Continous range sum: 400
Lookup list: [[100, 0], [300, 100], [500, 200], [700, 300]]
100 is at 0.0
200 is at 0.25
300 is at 0.25
400 is at 0.5
500 is at 0.5
600 is at 0.75
700 is at 0.75
800 is at 1.0
0 is at 100.0
0.25 is at 300.0
0.5 is at 500.0
0.75 is at 700.0
1 is at 800.0
$> ruby range.rb
Input range: [[100, 200], [300, 400], [500, 600], [700, 1000]]
Continous range sum: 600
Lookup list: [[100, 0], [300, 100], [500, 200], [700, 300]]
100 is at 0.0
200 is at 0.166666666666667
300 is at 0.166666666666667
400 is at 0.333333333333333
500 is at 0.333333333333333
600 is at 0.5
700 is at 0.5
1000 is at 1.0
0 is at 100.0
0.25 is at 350.0
0.5 is at 700.0
0.75 is at 850.0
1 is at 1000.0
Кажется, он работает с любым диапазоном, который я ему даю, туда и обратно.