Guest User

Untitled

a guest
Apr 4th, 2021
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.79 KB | None | 0 0
  1. import string
  2. from timeit import timeit
  3.  
  4.  
  5. ALPHABET_FROM = {x: i for i, x in enumerate(string.digits + string.ascii_uppercase)}
  6. ALPHABET_TO = dict(enumerate(string.digits + string.ascii_uppercase))
  7.  
  8.  
  9. def to_10(number: str, base, symbols=ALPHABET_FROM):
  10.     if len(symbols) < base:
  11.         raise ValueError('Not enough symbols in alphabet')
  12.     digits = map(symbols.get, number[::-1])
  13.     return sum(x * base ** i for i, x in enumerate(digits))
  14.  
  15.  
  16. def convert(number: str, to_base=10, from_base=10, symbols=ALPHABET_TO):
  17.     if len(symbols) < to_base:
  18.         raise ValueError('Not enough symbols in alphabet')
  19.     number = to_10(number, from_base)
  20.     digits = []
  21.     while number >= to_base:
  22.         number, mod = divmod(number, to_base)
  23.         digits.append(mod)
  24.     digits.append(number)
  25.     return ''.join(map(symbols.get, reversed(digits)))
  26.  
  27.  
  28. def convert_pavel(num, to_base=10, from_base=10):
  29.     txt = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  30.     dd = 0
  31.     rrr = []
  32.     for _ in range(len(num)):
  33.         dd += int(txt.find(num[_], 0,35))*from_base**(len(num)-1-_)
  34.     while dd != 0:
  35.         rr1 = int(dd) // to_base
  36.         rr2 = int(dd) % to_base
  37.         rrr.append(txt[rr2])
  38.         dd = rr1
  39.     ss = ''.join(rrr[::-1])
  40.     return ss
  41.  
  42.  
  43. if __name__ == '__main__':
  44.     assert convert('22', 2) == '10110'
  45.     assert convert('571', 8) == '1073'
  46.     assert convert('1', 16) == '1'
  47.     assert convert('10', 16) == 'A'
  48.     assert convert('15', 16) == 'F'
  49.     assert convert('16', 16) == '10'
  50.     assert convert('17', 16) == '11'
  51.     assert convert('26', 16) == '1A'
  52.     assert convert('32', 16) == '20'
  53.     assert convert('45', 16) == '2D'
  54.     assert convert('1000', 16) == '3E8'
  55.     print(timeit(lambda: convert('1000', 16)))
  56.     print(timeit(lambda: convert_pavel('1000', 16)))
  57.  
Advertisement
Add Comment
Please, Sign In to add comment