+++ /dev/null
-"""
-All classes for conversions are defined below:
- each class should have one method for converting "to_base and another for converting "from_base"
-the return value is the converted value to or from base
-"""
-
-# For the sake of eval'ing some code
-import math
-
-
-# used for Computer numbers base definitions.
-ALPHA_NUMERIC = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
-
-
-def makeBase(x, base = len(ALPHA_NUMERIC), table=ALPHA_NUMERIC):
- """
- Convert from base 10 to any other base.
- >> makeBase(1, 10)
- '1'
- >> makeBase(11, 10)
- '11'
- >> makeBase(11, 16)
- 'b'
- """
- div, mod = divmod(x, base)
- if not div:
- return table[mod]
- return makeBase(div, base, table) + table[mod]
-
-
-# roman numerals
-roman_group = {
- 1: ('i', 'v'),
- 10: ('x', 'l'),
- 100: ('c', 'd'),
- 1000: ('m', 'A'),
- 10000: ('B', 'C'),
-}
-
-
-# functions that convert Arabic digits to roman numerals
-roman_value = {
- 0: lambda i, v, x: '',
- 1: lambda i, v, x: i,
- 2: lambda i, v, x: i+i,
- 3: lambda i, v, x: i+i+i,
- 4: lambda i, v, x: i+v,
- 5: lambda i, v, x: v,
- 6: lambda i, v, x: v+i,
- 7: lambda i, v, x: v+i+i,
- 8: lambda i, v, x: v+i+i+i,
- 9: lambda i, v, x: i+x,
-}
-
-
-def toroman(n):
- """
- convert a decimal number in [1,4000) to a roman numeral
- >>> toroman(0)
- >>> toroman(4001)
- >>> toroman(1)
- 'i'
- >>> toroman(4)
- 'iv'
- >>> toroman(5)
- 'v'
- >>> toroman(10)
- 'x'
- >>> toroman(15)
- 'xv'
- """
- if n < 0:
- raise NotImplementedError("Value out of roman comprehension")
- elif n == 0:
- pass
- elif n >= 4000:
- raise NotImplementedError("Value Out of Range")
-
- base = 1
- s = ''
- while n > 0:
- i, v = roman_group[base]
- base = base * 10
- x, l = roman_group[base]
- digit = n % 10
- n = (n-digit)/10
- s = roman_value[digit](i, v, x) + s
- return s
-
-
-def fromroman(s, rbase = 1):
- """
- convert a roman numeral (in lowercase) to a decimal integer
- >>> fromroman('')
- 0
- >>> fromroman('x')
- 5
- >>> fromroman('xv')
- 15
- """
- if len(s) == 0:
- return 0
- elif rbase > 1000:
- return 0
-
- i, v = roman_group[rbase]
- x, l = roman_group[rbase*10]
- conversions = [
- (v+i+i+i, 8),
- (i+i+i+i, 5),
- (v+i+i, 7),
- (i+i+i, 3),
- (v+i, 6),
- (i+x, 9),
- (i+v, 4),
- (i+i, 2),
- (i, 1),
- (v, 5),
- ]
- for conversion in conversions:
- if s.endswith(conversion[0]):
- digit = conversion[1]
- s = s[:-len(conversion[0])]
- break
- else:
- digit = 0
- s = s
-
- return digit * rbase + fromroman(s, rbase*10)
-
-
-class simple_multiplier(object):
-
- def to_base(self, value, multiplier):
- return value * (multiplier)
-
- def from_base(self, value, multiplier):
- if multiplier == 0:
- return 0.0
- else:
- return value / (multiplier)
-
-
-class simple_inverter(object):
-
- def to_base(self, value, multiplier):
- if value == 0:
- return 0.0
- else:
- return (multiplier) / value
-
- def from_base(self, value, multiplier):
- if value == 0:
- return 0.0
- else:
- return (multiplier) / value
-
-
-class simple_gain_offset(object):
-
- def to_base(self, value, (gain, offset)):
- return (value * (gain)) + offset
-
- def from_base(self, value, (gain, offset)):
- if gain == 0:
- return 0.0
- else:
- return (value - offset) / gain
-
-
-class simple_offset_gain(object):
-
- def to_base(self, value, (offset, gain)):
- return (value + offset) * gain
-
- def from_base(self, value, (offset, gain)):
- if gain == 0:
- return 0.0
- else:
- return (value / gain) - offset
-
-
-class slope_offset(object):
- ''"convert using points on a graph''"
-
- def to_base(self, value, ((low_in, high_in), (low_out, high_out))):
- gain = (high_out-low_out)/(high_in-low_in)
- offset = low_out - gain*low_in
- return gain*value+offset
-
- def from_base(self, value, ((low_out, high_out), (low_in, high_in))):
- gain = (high_out-low_out)/(high_in-low_in)
- offset = low_out - gain*low_in
- return gain*value+offset
-
-
-class double_slope_offset(object):
- ''"convert using points on a graph, graph split into two slopes''"
-
- def to_base(self, value, ((low1_in, high1_in), (low1_out, high1_out), (low2_in, high2_in), (low2_out, high2_out))):
- if low1_in <= value <= high1_in:
- gain = (high1_out-low1_out)/(high1_in-low1_in)
- offset = low1_out - gain*low1_in
- return gain*value+offset
- if low2_in <= value <= high2_in:
- gain = (high2_out-low2_out)/(high2_in-low2_in)
- offset = low2_out - gain*low2_in
- return gain*value+offset
- return 0.0
-
- def from_base(self, value, ((low1_in, high1_in), (low1_out, high1_out), (low2_in, high2_in), (low2_out, high2_out))):
- if low1_out <= value <= high1_out:
- gain = (high1_in-low1_in)/(high1_out-low1_out)
- offset = low1_in - gain*low1_out
- return gain*value+offset
- if low2_out <= value <= high2_out:
- gain = (high2_in-low2_in)/(high2_out-low2_out)
- offset = low2_in - gain*low2_out
- return gain*value+offset
- return 0.0
-
-
-class base_converter(object):
-
- def to_base(self, value, base):
- """
- Convert from any base to base 10 (decimal)
- """
- # Protection against fractional values
- value = value.split(".", 1)[0]
-
- result = 0L #will contain the long base-10 (decimal) number to be returned
- position = len(value) #length of the string that is to be converted
- for x in value:
- position = position-1
- result = long(result + long(long(ALPHA_NUMERIC.find(x))*(long(base)**long(position))))
- return result
-
- def from_base(self, value, base):
- """
- Convert from decimal to any base
- """
- return makeBase(int(value), base)
-
-
-class roman_numeral(object):
-
- def to_base(self, value, junk):
- """
- Convert from roman numeral to base 10 (decimal)
- """
- if value == "0":
- return 0L
- else:
- return fromroman(value)
-
- def from_base(self, value, junk):
- """
- Convert from decimal to roman numeral
- """
- return toroman(int(value))
-
-
-
-class function(object):
- ''"defined simple function can be as complicated as you like, however, both to/from base must be defined.''"
-
- #value is assumed to be a string
- #convert from a defined function to base
- def to_base(self, value, (to_base, from_base)):
- leftOfX, rightOfX = to_base.split("x", 1)
- y = 0 # "undefined" y was driving me nuts
- exec "y=" + leftOfX + str(value) + rightOfX
- return y
-
- def from_base(self, value, (to_base, from_base)):
- leftOfX, rightOfX = from_base.split("x", 1)
- y = 0 # "undefined" y was driving me nuts
- exec "y=" + leftOfX + str(value) + rightOfX
- return y
-
-
-#--------- function definitions from classes ------------
-m = simple_multiplier()
-inv = simple_inverter()
-gof = simple_gain_offset()
-ofg = simple_offset_gain()
-slo = slope_offset()
-dso = double_slope_offset()
-b = base_converter()
-r = roman_numeral()
-f = function()