Note: You are viewing an old version of this page. View the current version.

Differences between version 2 and previous revision of KnowledgeBase/Scripts/Base80.rb.

Other diffs: Previous Major Revision, Previous Author

Newer page: version 2 Last edited on Sunday, 14 March 2010 22:53:05 by CyberLeo Revert
Older page: version 1 Last edited on Sunday, 14 March 2010 22:51:51 by CyberLeo Revert
@@ -63,7 +63,11 @@
  end 
  
  def to_s 
  @str 
+ end  
+  
+ def zero?  
+ @int.zero?  
  end 
 end 
 </code> 

version 2

class Base80
  @@symbols = "!()*,-.0123456789:;@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~"
  @@radix = @@symbols.length

  @int = 0
  @str = "!"

  def self.symbols
    @@symbols
  end

  def self.radix
    @@radix
  end

  def self.symbols_valid?(number)
    !!(number =~ Regexp.new("^[" << @@symbols.gsub(/[\[\]]/) {|m| "\\" << m } << "]*$"))
  end

  def self.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

  def self.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

  def initialize(number)
    if number.is_a?(Fixnum)
      @int = number.to_i
      @str = self.class.itos(@int)
    elsif self.class.symbols_valid?(number.to_s)
      @str = number.to_s
      @int = self.class.stoi(@str)
    else
      raise "Not an Integer or a radix #{@@radix} number"
    end
  end

  def radix
    @@radix
  end

  def to_i
    @int
  end

  def to_s
    @str
  end

  def zero?
    @int.zero?
  end
end