निम्न कोड संख्याओं के मैप किए गए नामों के अनुक्रम को परिभाषित करता है। यह एक संख्या लेने और एक विशिष्ट नाम पुनर्प्राप्त करने के लिए डिज़ाइन किया गया है। कक्षा अपने कैश में नाम मौजूद होने के द्वारा संचालित होती है, और उसके बाद नाम को कैश में अनुक्रमणित करके लौटाती है। इसमें सवाल: कैश को संग्रहीत किए बिना संख्या के आधार पर नाम की गणना कैसे की जा सकती है?क्या कोई संख्या किसी नाम पर बदलने का एक तेज़ तरीका है?
नाम, एक बेस 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()
निम्नलिखित इंटरैक्टिव सत्र मानों होने की उम्मीद है में से कुछ दिखाने क्रम में लौटा
>>> NumberToName.convert(0)
'A'
>>> NumberToName.convert(26)
'_'
>>> NumberToName.convert(52)
'z'
>>> NumberToName.convert(53)
'A0'
>>> NumberToName.convert(1692)
'_1'
>>> NumberToName.convert(23893)
'FAQ'
दुर्भाग्यवश, इन नंबरों को इन सटीक नामों (एक रिवर्स रूपांतरण की अनुमति देने के लिए) मैप करने की आवश्यकता है।
कृपया ध्यान दें: बिट्स की एक चर संख्या प्राप्त की और एक संख्या में स्पष्ट रूप से बदल रहे हैं। यह संख्या पाइथन पहचानकर्ता नामस्थान में किसी नाम पर असंबद्ध रूप से परिवर्तित की जानी चाहिए। आखिरकार, वैध पायथन नाम संख्याओं में परिवर्तित हो जाएंगे, और इन नंबरों को बिट्स की एक चर संख्या में परिवर्तित कर दिया जाएगा।
अंतिम समाधान:
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]
क्यों इस विशेष आवश्यकता? क्या आप कृपया कैश के उद्देश्य को विस्तारित कर सकते हैं? –
कैश बहुत सारी मेमोरी का उपभोग करता है जिसकी वास्तव में आवश्यकता नहीं होनी चाहिए। – recursive
बिट्स की एक चर संख्या प्राप्त की जाती है और असंबद्ध रूप से एक संख्या में परिवर्तित हो जाती है। यह संख्या पाइथन पहचानकर्ता नामस्थान में किसी नाम पर असंबद्ध रूप से परिवर्तित की जानी चाहिए। आखिरकार, वैध पायथन नाम संख्याओं में परिवर्तित हो जाएंगे, और इन नंबरों को बिट्स की एक चर संख्या में परिवर्तित कर दिया जाएगा। –