module Rafini::Integer

Public Instance Methods

odometer(*levels, factors: true) click to toggle source

odometer Kinda hard to explain…

123.odometer(10,10) #=> [3,2,1]
30.odometer(2,3,5) #=> [0,0,0,1]
((60*60*24)*3 + (60*60)*12 + 60*15 + 30).odometer(60,60,24) #=> [30, 15, 12, 3]

Useful for making clocks, number scales, mayan long count… etc.

# File lib/rafini/integer.rb, line 10
def odometer(*levels, factors: true)
  raise RangeError, 'negative odometer' if self < 0
  readings, remainder = [], self

  levels = levels.inject([1]){|m, f| m.push(m.last*f)} if factors
  levels.shift

  levels.reverse_each do |level|
    # in case of a float, floor
    reading = (remainder/level).floor
    readings.unshift reading
    remainder = remainder%level
  end

  # in case of a float, round
  readings.unshift remainder.round
end