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