-
-
Save mxriverlynn/946728 to your computer and use it in GitHub Desktop.
I have a range, which could be made of two integers or a floating point numbers, and a value within that range. | |
I need to convert the range to a fixed size range (0..10) and adjust the value accordingly. | |
if the value is below the range, return 0. | |
if the value is above the range, return 10. | |
for example, range 1 through 100, value 50. convert to range 1 through 10 and adjusted value is 5. | |
another example, range 10.5 through 55, value of 27.2. convert to range 1 through 10 and the adjusted value is ??? | |
I need to know how to do the conversion of the original range to the target range, and how to adjust the value, accordingly. |
class RangeResults | |
def score(value) | |
range_size = self.high_risk_above - self.goal_below | |
adjusted_value = (value - self.goal_below) | |
adjusted_value = 0 if adjusted_value < 0 | |
adjusted_value = range_size if value > self.high_risk_above | |
value_percent = (adjusted_value / range_size) | |
raw_score = (10 * value_percent) | |
score = raw_score.round(0).to_i | |
puts "........adjusted value: #{adjusted_value}" | |
puts "........range size: #{range_size}" | |
puts "........value %: #{value_percent}" | |
puts "........raw score: #{raw_score}" | |
puts "........final score: #{score}" | |
score | |
end | |
end | |
range = RangeResults.new(:goal_below => 10, :high_risk_above => 60) | |
range.score(10) #=> 0 | |
range.score(5) #=> 0 | |
range.score(20) #=> 2 | |
range.score(35) #=> 5 | |
range.score(60) #=> 10 | |
range.score(80) #=> 10 |
okay, I took a closer look at your code, looks like the same logic, expressed differently. you've got more boundary condition checks but the same general idea. That's what I get for skimming a gist while trying to debug a failing build. ;-)
I think david has it. I wasn't sure what you were wanting until I read his simplified suggestion. Strange thing is... years ago, I had a similar algorithm when I created the USPS algorithm for postal rate calculations. I created ranges with increments within the ranges until a new range bracket was found. I think I replaced 10 with a sizing variable dependent upon the range needs. Anyway, this looks dead on to me.
Good job David! You're quicker on the draw than I am.
thanks david / dean. this appears to be working the way i need it to. :)
i think i'm on teh same track as you, in terms of what needs to happen and how to execute it. my solution appears to be a more verbose version of yours... so that's good... it means I'm dong something right. :)