module GenericRadix # Define symbols to be your alphabet @int = 0 @str = "" def radix @radix ||= symbols.length end module_function :radix def symbols_valid?(number) !!(number =~ Regexp.new("^[" << symbols.gsub(/[\[\]]/) {|m| "\\" << m } << "]*$")) end module_function :symbols_valid? def itos(number) number = number.to_i return symbols[0, 1] if number.zero? res = "" until number.zero? index = number % radix number = number / radix res = symbols[index, 1] + res end res end module_function :itos def stoi(number) number = number.dup.to_s.split(//) res = 0 until number.length.zero? char = number.shift index = symbols.index(char) res *= radix res += index end res end module_function :stoi def initialize(number) if number.is_a?(Fixnum) @int = number.to_i @str = itos(@int) elsif symbols_valid?(number.to_s) @str = number.to_s @int = stoi(@str) else raise "Not an Integer or a radix #{radix} number" end end def to_i @int end def to_s @str end def zero? @int.zero? end end class Base80 def symbols "!()*,-.0123456789:;@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~" end include GenericRadix end class Base256 def symbols ( Range.new(0,255).map {|ord| ord.chr }.join ) end include GenericRadix end
Note: You are viewing an old version of this page. View the current version.