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

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

Other diffs: Previous Major Revision, Previous Author

Newer page: version 3 Last edited on Sunday, 14 March 2010 23:08:45 by CyberLeo Revert
Older page: version 2 Last edited on Sunday, 14 March 2010 22:53:05 by CyberLeo Revert
@@ -1,62 +1,56 @@
 <code brush="ruby"> 
-class Base80  
- @@ symbols = "!()*,-.0123456789:;@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~"  
- @@radix = @@symbols.length  
-  
+module GenericRadix  
+ # Define symbols to be your alphabet  
  @int = 0 
- @str = "!
+ @str = "" 
  
- def self.symbols  
- @@ symbols 
+ def radix  
+ @radix ||= symbols.length  
  end 
+ module_function :radix  
  
- def self.radix  
- @@radix  
+ def symbols_valid?(number)  
+ !!(number =~ Regexp.new("^[" << symbols.gsub(/[\[\]]/) {|m| "\\" << m } << "]*$"))  
  end 
+ module_function :symbols_valid?  
  
- def self.symbols_valid?(number)  
- !!(number =~ Regexp.new("^[" << @@symbols.gsub(/[\[\]]/) {|m| "\\" << m } << "]*$"))  
- end  
-  
- def self. itos(number) 
+ def itos(number) 
  number = number.to_i 
- return @@ symbols[0, 1] if number.zero? 
+ return symbols[0, 1] if number.zero? 
  res = "" 
  until number.zero? 
- index = number % @@ radix  
- number = number / @@ radix  
- res = @@ symbols[index, 1] + res 
+ index = number % radix  
+ number = number / radix  
+ res = symbols[index, 1] + res 
  end 
  res 
  end 
+ module_function :itos  
  
- def self. stoi(number) 
+ def stoi(number) 
  number = number.dup.to_s.split(//) 
  res = 0 
  until number.length.zero? 
  char = number.shift 
- index = @@ symbols.index(char)  
- res *= @@ radix 
+ 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 = self.class. itos(@int)  
- elsif self.class. symbols_valid?(number.to_s) 
+ @str = itos(@int)  
+ elsif symbols_valid?(number.to_s) 
  @str = number.to_s 
- @int = self.class. stoi(@str) 
+ @int = stoi(@str) 
  else 
- raise "Not an Integer or a radix #{@@ radix} number" 
+ raise "Not an Integer or a radix #{radix} number" 
  end 
- end  
-  
- def radix  
- @@radix  
  end 
  
  def to_i 
  @int 
@@ -68,6 +62,20 @@
  
  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 
 </code> 

version 3

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