Noc*_*wer 8 python namespaces converter
以下代码定义了映射到数字的名称序列.它旨在获取一个数字并检索特定名称.该类通过确保名称存在于其缓存中来运行,然后通过索引将其返回到其缓存中来返回名称.问题在于:如何在不存储缓存的情况下根据数量计算名称?
该名称可以被认为是基数63,除了始终在基数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()
Run Code Online (Sandbox Code Playgroud)
以下交互式会话显示了一些预期按顺序返回的值.
>>> NumberToName.convert(0)
'A'
>>> NumberToName.convert(26)
'_'
>>> NumberToName.convert(52)
'z'
>>> NumberToName.convert(53)
'A0'
>>> NumberToName.convert(1692)
'_1'
>>> NumberToName.convert(23893)
'FAQ'
Run Code Online (Sandbox Code Playgroud)
不幸的是,这些数字需要映射到这些确切的名称(以允许反向转换).
请注意:接收可变数量的位并将其明确转换为数字.应将此数字明确转换为Python标识名称空间中的名称.最终,有效的Python名称将转换为数字,这些数字将转换为可变数量的位.
最终解决方案
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]
Run Code Online (Sandbox Code Playgroud)
这是一个充满1个错误的有趣小问题.
没有循环:
import string
first_digits = sorted(string.ascii_letters + '_')
rest_digits = sorted(string.digits + string.ascii_letters + '_')
def convert(number):
if number < len(first_digits):
return first_digits[number]
current_base = len(rest_digits)
remain = number - len(first_digits)
return convert(remain / current_base) + rest_digits[remain % current_base]
Run Code Online (Sandbox Code Playgroud)
测试:
print convert(0)
print convert(26)
print convert(52)
print convert(53)
print convert(1692)
print convert(23893)
Run Code Online (Sandbox Code Playgroud)
输出:
A
_
z
A0
_1
FAQ
Run Code Online (Sandbox Code Playgroud)