Il seguente codice definisce una sequenza di nomi associati ai numeri. È progettato per prendere un numero e recuperare un nome specifico. La classe opera assicurandosi che il nome esista nella sua cache e quindi restituisce il nome indicizzandolo nella sua cache. La domanda in questo: come si può calcolare il nome in base al numero senza memorizzare una cache?C'è un modo più veloce di convertire un numero in un nome?
Il nome può essere pensato come un numero di base 63, ad eccezione della prima cifra che è sempre della 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()
le seguenti sessioni interattive mostrano alcuni dei valori che dovrebbero essere restituito in ordine.
>>> NumberToName.convert(0)
'A'
>>> NumberToName.convert(26)
'_'
>>> NumberToName.convert(52)
'z'
>>> NumberToName.convert(53)
'A0'
>>> NumberToName.convert(1692)
'_1'
>>> NumberToName.convert(23893)
'FAQ'
Sfortunatamente, questi numeri devono essere associati a questi nomi esatti (per consentire una conversione inversa).
Nota: un numero variabile di bit viene ricevuto e convertito in un numero senza ambiguità. Questo numero deve essere convertito in modo non ambiguo in un nome nello spazio dei nomi dell'identificatore Python. Alla fine, i nomi Python validi saranno convertiti in numeri e questi numeri saranno convertiti in un numero variabile di bit.
soluzione finale:
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]
Perchè questo requisito speciale? Potresti per favore elaborare lo scopo della no cache? –
La cache consuma molta memoria che in realtà non dovrebbe essere necessaria. – recursive
Un numero variabile di bit viene ricevuto e convertito in modo univoco in un numero. Questo numero deve essere convertito in modo non ambiguo in un nome nello spazio dei nomi dell'identificatore Python. Alla fine, i nomi Python validi saranno convertiti in numeri e questi numeri saranno convertiti in un numero variabile di bit. –