seansummers
7/13/2017 - 7:39 PM

Python implementation of Tantek's NewBase60

Python implementation of Tantek's NewBase60

''' newbase60.py - Python implementation of Tantek's NewBase60
    http://ttk.me/w/NewBase60
    by Sean Summers <seansummers@gmail.com>
    License: https://creativecommons.org/licenses/by/4.0/
'''
import functools
import itertools
import string

AMBIGUOUS_CHARACTERS = {
    'I': '1',
    'O': '0',
    'l': '1',
}

CHARACTERS = ''.join(
    character
    for character in itertools.chain(
        string.digits,
        string.ascii_uppercase,
        '_',
        string.ascii_lowercase,
    ) if character not in AMBIGUOUS_CHARACTERS
)

BASE = len(CHARACTERS)


def _accumulate(n, c):
    c = AMBIGUOUS_CHARACTERS[c] if c in AMBIGUOUS_CHARACTERS else c
    return n * BASE + max(0, CHARACTERS.find(c))


def _values(n):
    while n:
        n, c = divmod(n, BASE)
        yield c


def num_to_sxg(n):
    sxg = [CHARACTERS[c] for c in _values(n)] or '0'
    return ''.join(reversed(sxg))


def sxg_to_num(s):
    return functools.reduce(_accumulate, s, 0)