|
1 | | -import doctest |
2 | 1 | import string |
3 | 2 |
|
4 | | -CHARSET = string.digits + string.ascii_lowercase + string.ascii_uppercase |
5 | | - |
6 | 3 |
|
7 | 4 | def base62_encode(num: int) -> str: |
8 | 5 | """ |
9 | 6 | Encodes a positive integer into a base62 string. |
10 | | - >>> base62_encode(0) |
11 | | - '0' |
12 | | - >>> base62_encode(123) |
13 | | - '1z' |
14 | | - >>> base62_encode(1000000) |
15 | | - '4C92' |
16 | 7 | """ |
17 | 8 | if num == 0: |
18 | | - return CHARSET[0] |
| 9 | + return "0" |
19 | 10 |
|
20 | 11 | arr = [] |
21 | | - base = len(CHARSET) |
| 12 | + base = 62 |
| 13 | + charset = string.digits + string.ascii_lowercase + string.ascii_uppercase |
22 | 14 | while num: |
23 | 15 | num, rem = divmod(num, base) |
24 | | - arr.append(CHARSET[rem]) |
| 16 | + arr.append(charset[rem]) |
25 | 17 | arr.reverse() |
26 | 18 | return "".join(arr) |
27 | 19 |
|
28 | 20 |
|
29 | 21 | def base62_decode(string_val: str) -> int: |
30 | 22 | """ |
31 | 23 | Decodes a base62 string into a positive integer. |
32 | | - >>> base62_decode('0') |
33 | | - 0 |
34 | | - >>> base62_decode('1z') |
35 | | - 123 |
36 | | - >>> base62_decode('4C92') |
37 | | - 1000000 |
38 | 24 | """ |
39 | | - base = len(CHARSET) |
| 25 | + base = 62 |
| 26 | + charset = string.digits + string.ascii_lowercase + string.ascii_uppercase |
40 | 27 | strlen = len(string_val) |
41 | 28 | num = 0 |
42 | 29 |
|
43 | 30 | for idx, char in enumerate(string_val): |
44 | 31 | power = strlen - (idx + 1) |
45 | | - num += CHARSET.index(char) * (base**power) |
| 32 | + num += charset.index(char) * (base**power) |
46 | 33 | return num |
47 | 34 |
|
48 | 35 |
|
| 36 | +def test_base62() -> None: |
| 37 | + """ |
| 38 | + Tests for base62_encode and base62_decode. |
| 39 | + """ |
| 40 | + assert base62_encode(0) == "0" |
| 41 | + assert base62_encode(123) == "1z" |
| 42 | + assert base62_encode(1000000) == "4C92" |
| 43 | + assert base62_decode("0") == 0 |
| 44 | + assert base62_decode("1z") == 123 |
| 45 | + assert base62_decode("4C92") == 1000000 |
| 46 | + |
| 47 | + |
49 | 48 | if __name__ == "__main__": |
| 49 | + import doctest |
| 50 | + |
50 | 51 | doctest.testmod() |
| 52 | + test_base62() |
0 commit comments