class BaseN::Encoder

Constants

PRIMITIVES

Attributes

base[RW]

Public Class Methods

highest_supported() click to toggle source
# File lib/base_n.rb, line 29
def self.highest_supported
  new PRIMITIVES.size
end
new(base) click to toggle source
# File lib/base_n.rb, line 23
def initialize base
  self.base = base
  raise "I only support bases 2 and above" if base < 2
  raise "I only support up to base #{primitives.size}" if base > primitives.size
end

Public Instance Methods

case_sensitive?() click to toggle source
# File lib/base_n.rb, line 33
def case_sensitive?
  base > 36
end
decode(subject) click to toggle source
# File lib/base_n.rb, line 41
def decode subject
  r = subject.representation
  r.upcase! unless Encoder.new(subject.base).case_sensitive?
  s = r.reverse.split('')

  total = 0
  s.each_with_index do |char, index|
    if ord = primitives.index(char)
      total += ord * (base ** index)
    else
      raise ArgumentError, "#{subject} has #{char} which is not valid"
    end
  end
  total
end
encode(subject) click to toggle source
# File lib/base_n.rb, line 57
def encode subject
  subject = Number.new subject.to_s, 10 unless subject.kind_of? BaseN::Number
  return subject if subject.base == base

  i = Encoder.new(subject.base).decode(subject)

  s = ''

  while i > 0
    s << primitives[i.modulo(base)]
    i /= base
  end
  s = '0' if s == ''
  Number.new s.reverse, base
end
primitives() click to toggle source
# File lib/base_n.rb, line 37
def primitives
  PRIMITIVES[0, base]
end