Module: Baseconv

Defined in:
lib/baseconv.rb,
lib/baseconv/version.rb

Constant Summary collapse

CHARS =
[*("0".."9"), *("a".."z"), *("A".."Z")].join.freeze
MIN =
2
MAX =
CHARS.size
InvalidRadix =
Class.new(StandardError)
VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.convert(digits, from_base:, to_base:) ⇒ Object

Convert

Convert the digits representation of a number from a given base to another.



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/baseconv.rb', line 15

def convert(digits, from_base:, to_base:)
  if from_base > MAX || to_base > MAX || from_base < MIN || to_base < MIN
    raise InvalidRadix,
      "cannot convert #{digits} from base #{from_base} to base #{to_base}"
  end

  if from_base < 37 && to_base < 37
    return digits.to_s.to_i(from_base).to_s(to_base)
  end

  represent(value_of(digits.to_s, in_base: from_base), in_base: to_base)
end

.represent(number, in_base:) ⇒ Object

Value to Representation

Convert a positive number n to its digit representation in base b.



31
32
33
34
35
36
37
38
39
40
# File 'lib/baseconv.rb', line 31

def represent(number, in_base:)
  digits = ""

  while number > 0
    digits = CHARS[number % in_base] + digits
    number = number / in_base
  end

  digits
end

.value_of(digits, in_base:) ⇒ Object

Representation to Value

Compute the number given by digits in base b.



45
46
47
48
49
50
51
52
53
# File 'lib/baseconv.rb', line 45

def value_of(digits, in_base:)
  number = 0

  digits.to_s.chars.each do |digit|
    number = in_base * number + CHARS.index(digit)
  end

  number
end