Create A Base 12 Calculator With Different Limits At Diferent Digits With Python
I want o create a calculator that can add (and multiply, divide, etc) numbers in base 12 and with different limits at the different digits. Base 12 sequence: [0,1,2,3,4,5,6,7,8,9,'
Solution 1:
You can define two converters:
class Base12Convert:
d = {hex(te)[2:].upper():te for te in range(0,12)}
d.update({val:key for key,val in d.items()})
d["-"] = "-"
@staticmethod
def text_to_int(text):
"""Converts a base-12 text into an int."""
if not isinstance(text,str):
raise ValueError(
f"Only strings allowed: '{text}' of type '{type(text)}' is invalid")
t = text.strip().upper()
if any (x not in Base12Convert.d for x in t):
raise ValueError(
f"Only [-0123456789abAB] allowed in string: '{t}' is invalid")
if "-" in t.lstrip("-"):
raise ValueError(f"Sign '-' only allowed in front. '{t}' is invalid")
# easy way
return int(t,12)
# self-calculated way
# return sum(Base12Convert.d[num]*12**idx for idx,num in enumerate(t[::-1]))
@staticmethod
def int_to_text(num):
"""Converts an int into a base-12 string."""
sign = ""
if not isinstance(num,int):
raise ValueError(
f"Only integer as input allowed: '{num} of type {type(num)}' is invalid")
if num < 0:
sign = "-"
num *= -1
# get highest possible number
p = 1
while p < num:
p *= 12
# create string
rv = [sign]
while True:
p /= 12
div = num // p
num -= div*p
rv.append(Base12Convert.d[div])
if p == 1:
break
return ''.join(rv)
Then you can use them to convert what you want:
text = "14:54:31" # some time
# convert each int of the time into base12 - join with | again
base12 = '|'.join(Base12Convert.int_to_text (int(t)) for t in text.split(":"))
# split base12 at |, convert to int, make str from int and join with | again
base10 = '|'.join(map(str,(Base12Convert.text_to_int (b12) for b12 in base12.split("|"))))
# print all 3
print(text,base12,base10,sep="\n")
Output:
14:54:31
12|46|27
14|54|31
and enforce whatever restrictions you have on your "digits" using normal ints. You should split up your "digits" of a clock ... 14b
(203 in base 10) does not make sense, 1:4b
might if you mean 1:59 hours/minutes.
Post a Comment for "Create A Base 12 Calculator With Different Limits At Diferent Digits With Python"