Christian Neukirchen <chneukirchen / gmail.com> writes:

> Also, you may want to extend it to be like APL's "encode" (tack), so you
> can do stuff like:

For fun, an implementation of encode/decode.


class Integer
  def encode(restbase, *bases)
    mybases = bases.dup
    result = []
    n = self

    while base = mybases.pop || restbase
      break  if n < base
      break  if base.zero?
      result << n % base
      n = n / base
    end

    result << n

    if (missing = bases.size - result.size + 1) > 0
      result.concat [0] * missing
    end

    result.reverse!
  end
end

class Array
  def decode(restbase, *bases)
    bases = bases.dup
    result = 0
    factor = 1

    self.reverse_each { |a|
      base = bases.pop || restbase
      result += a * factor
      factor *= base
    }
    
    result
  end
end

p 01776.encode(8)                # => [1, 0, 2, 2]  (octal -> decimal)
p [1, 7, 7, 6].decode(8)         # => 1022

p 105246.encode(0, 1760, 3, 12)  # => [1,     1163,  1,    6]
                                 #    [miles, yards, feet, inches]

p [14,   12,    20,      57].decode(0, 24, 60, 60)  # => 1254057
# [days, hours, minutes, seconds]

duration = 324477
p "Runtime: %d days %02d:%02d:%02d" % duration.encode(0, 24, 60, 60)


Happy hacking,
-- 
Christian Neukirchen  <chneukirchen / gmail.com>  http://chneukirchen.org