El siguiente código define una secuencia de nombres que están asignados a números. Está diseñado para tomar un número y recuperar un nombre específico. La clase funciona asegurando que el nombre existe en su caché, y luego devuelve el nombre indizando en su caché. La pregunta en esto: ¿cómo se puede calcular el nombre basado en el número sin almacenar un caché?¿Existe alguna forma más rápida de convertir un número en un nombre?
El nombre puede ser pensado como un número de base 63, a excepción de la primera cifra que siempre está en la base 53.
class NumberToName:
def __generate_name():
def generate_tail(length):
if length > 0:
for char in NumberToName.CHARS:
for extension in generate_tail(length - 1):
yield char + extension
else:
yield ''
for length in itertools.count():
for char in NumberToName.FIRST:
for extension in generate_tail(length):
yield char + extension
FIRST = ''.join(sorted(string.ascii_letters + '_'))
CHARS = ''.join(sorted(string.digits + FIRST))
CACHE = []
NAMES = __generate_name()
@classmethod
def convert(cls, number):
for _ in range(number - len(cls.CACHE) + 1):
cls.CACHE.append(next(cls.NAMES))
return cls.CACHE[number]
def __init__(self, *args, **kwargs):
raise NotImplementedError()
Las siguientes sesiones interactivas muestran algunos de los valores que se espera que sean regresó en orden.
>>> NumberToName.convert(0)
'A'
>>> NumberToName.convert(26)
'_'
>>> NumberToName.convert(52)
'z'
>>> NumberToName.convert(53)
'A0'
>>> NumberToName.convert(1692)
'_1'
>>> NumberToName.convert(23893)
'FAQ'
Lamentablemente, estos números deben correlacionarse con estos nombres exactos (para permitir una conversión inversa).
Tenga en cuenta: Un número variable de bits se reciben y se convierte de forma inequívoca en un número. Este número se debe convertir sin ambigüedades a un nombre en el espacio de nombres del identificador de Python. Finalmente, los nombres válidos de Python se convertirán en números, y estos números se convertirán a una cantidad variable de bits.
solución final:
import string
HEAD_CHAR = ''.join(sorted(string.ascii_letters + '_'))
TAIL_CHAR = ''.join(sorted(string.digits + HEAD_CHAR))
HEAD_BASE, TAIL_BASE = len(HEAD_CHAR), len(TAIL_CHAR)
def convert_number_to_name(number):
if number < HEAD_BASE: return HEAD_CHAR[number]
q, r = divmod(number - HEAD_BASE, TAIL_BASE)
return convert_number_to_name(q) + TAIL_CHAR[r]
¿Por qué este requisito especial? ¿Podrías por favor elaborar el propósito de no caché? –
El caché consume mucha memoria que realmente no debería ser necesaria. – recursive
Se recibe una cantidad variable de bits y se convierte sin ambigüedad en un número. Este número se debe convertir sin ambigüedades a un nombre en el espacio de nombres del identificador de Python. Finalmente, los nombres válidos de Python se convertirán en números, y estos números se convertirán a una cantidad variable de bits. –