Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import string
- from timeit import timeit
- ALPHABET_FROM = {x: i for i, x in enumerate(string.digits + string.ascii_uppercase)}
- ALPHABET_TO = dict(enumerate(string.digits + string.ascii_uppercase))
- def to_10(number: str, base, symbols=ALPHABET_FROM):
- if len(symbols) < base:
- raise ValueError('Not enough symbols in alphabet')
- digits = map(symbols.get, number[::-1])
- return sum(x * base ** i for i, x in enumerate(digits))
- def convert(number: str, to_base=10, from_base=10, symbols=ALPHABET_TO):
- if len(symbols) < to_base:
- raise ValueError('Not enough symbols in alphabet')
- number = to_10(number, from_base)
- digits = []
- while number >= to_base:
- number, mod = divmod(number, to_base)
- digits.append(mod)
- digits.append(number)
- return ''.join(map(symbols.get, reversed(digits)))
- def convert_pavel(num, to_base=10, from_base=10):
- txt = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- dd = 0
- rrr = []
- for _ in range(len(num)):
- dd += int(txt.find(num[_], 0,35))*from_base**(len(num)-1-_)
- while dd != 0:
- rr1 = int(dd) // to_base
- rr2 = int(dd) % to_base
- rrr.append(txt[rr2])
- dd = rr1
- ss = ''.join(rrr[::-1])
- return ss
- if __name__ == '__main__':
- assert convert('22', 2) == '10110'
- assert convert('571', 8) == '1073'
- assert convert('1', 16) == '1'
- assert convert('10', 16) == 'A'
- assert convert('15', 16) == 'F'
- assert convert('16', 16) == '10'
- assert convert('17', 16) == '11'
- assert convert('26', 16) == '1A'
- assert convert('32', 16) == '20'
- assert convert('45', 16) == '2D'
- assert convert('1000', 16) == '3E8'
- print(timeit(lambda: convert('1000', 16)))
- print(timeit(lambda: convert_pavel('1000', 16)))
Advertisement
Add Comment
Please, Sign In to add comment