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

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

Other diffs: Previous Major Revision, Previous Author

Newer page: version 5 Last edited on Sunday, 14 March 2010 23:27:21 by CyberLeo Revert
Older page: version 4 Last edited on Sunday, 14 March 2010 23:09:33 by CyberLeo Revert
@@ -1,7 +1,8 @@
 <code brush="ruby"> 
 module GenericRadix 
  # Define symbols to be your alphabet 
+ # Define transform to transform the string before and after conversion  
  @int = 0 
  @str = "" 
  
  def radix 
@@ -9,9 +10,10 @@
  end 
  module_function :radix 
  
  def symbols_valid?(number) 
- !!( number =~ Regexp .new ("^[" << symbols.gsub (/[\[\]] /) {|m| "\\" << m } << "]*$" )) 
+ number = transform(number) if respond_to?(:transform)  
+ ( number .split (//) - symbols.split (//) ).empty?  
  end 
  module_function :symbols_valid? 
  
  def itos(number) 
@@ -22,13 +24,15 @@
  index = number % radix 
  number = number / radix 
  res = symbols[index, 1] + res 
  end 
+ res = transform(res) if respond_to?(:transform)  
  res 
  end 
  module_function :itos 
  
  def stoi(number) 
+ number = transform(number) if respond_to?(:transform)  
  number = number.dup.to_s.split(//) 
  res = 0 
  until number.length.zero? 
  char = number.shift 
@@ -44,12 +48,13 @@
  if number.is_a?(Fixnum) 
  @int = number.to_i 
  @str = itos(@int) 
  elsif symbols_valid?(number.to_s) 
+ number = transform(number) if respond_to?(:transform)  
  @str = number.to_s 
  @int = stoi(@str) 
  else 
- raise "Not an Integer or a radix #{radix} number
+ raise "Not an Integer or a radix #{radix} string
  end 
  end 
  
  def to_i 
@@ -62,8 +67,19 @@
  
  def zero? 
  @int.zero? 
  end 
+end  
+  
+class Base16  
+ def symbols  
+ "0123456789ABCDEF"  
+ end  
+ # Transform the string before and after translation  
+ def transform(string)  
+ string.upcase  
+ end  
+ include GenericRadix  
 end 
  
 class Base80 
  def symbols 

version 5

module GenericRadix
  # Define symbols to be your alphabet
  # Define transform to transform the string before and after conversion
  @int = 0
  @str = ""

  def radix
    @radix ||= symbols.length
  end
  module_function :radix

  def symbols_valid?(number)
    number = transform(number) if respond_to?(:transform)
    ( number.split(//) - symbols.split(//) ).empty?
  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 = transform(res) if respond_to?(:transform)
    res
  end
  module_function :itos

  def stoi(number)
    number = transform(number) if respond_to?(:transform)
    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 = 0)
    if number.is_a?(Fixnum)
      @int = number.to_i
      @str = itos(@int)
    elsif symbols_valid?(number.to_s)
      number = transform(number) if respond_to?(:transform)
      @str = number.to_s
      @int = stoi(@str)
    else
      raise "Not an Integer or a radix #{radix} string"
    end
  end

  def to_i
    @int
  end

  def to_s
    @str
  end

  def zero?
    @int.zero?
  end
end

class Base16
  def symbols
    "0123456789ABCDEF"
  end
  # Transform the string before and after translation
  def transform(string)
    string.upcase
  end
  include GenericRadix
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