RFC 2550 एक व्यंग्यपूर्ण प्रस्ताव है (1 अप्रैल, 1999 को प्रकाशित) एक अंतरिक्ष-कुशल ASCII के लिए टाइमस्टैम्प का प्रतिनिधित्व जो किसी भी तारीख (ब्रह्मांड की शुरुआत से पहले और ब्रह्मांड के अनुमानित अंत से पहले वाले) का समर्थन कर सकता है। एक RFC 2550-संगत टाइमस्टैम्प की गणना करने के लिए एल्गोरिथ्म इस प्रकार है (ध्यान दें: सभी श्रेणियों में प्रारंभ शामिल है लेकिन अंत को शामिल करें - 0 से 10,000 का अर्थ है सभी n
जहाँ 0 <= n < 10000
):
- वर्ष प्रारूप
- साल 0 से 10,000: एक 4-अंकीय दशमलव संख्या, शून्य-बाएँ।
- वर्ष 10,000 से 100,000: एक 5 अंकों की दशमलव संख्या, वर्ण ए के साथ उपसर्ग।
- १००,००,००० से १० ३० : वर्ष के लिए दशमलव संख्या, अपरकेस ASCII अक्षर के साथ उपसर्ग जिसका अंग्रेजी वर्णमाला में सूचकांक दशमलव वर्ष में अंकों की संख्या के बराबर है, शून्य से ५ (६ अंकों के वर्षों के लिए बी, C के लिए C) -digit वर्ष, आदि)।
- वर्ष 10 30 से 10 56 : एक ही प्रारूप 10,000 से 10 30 , ए के साथ अक्षरों को शुरू करना, और इसके अलावा
^
स्ट्रिंग के लिए एक कैरेट ( ) को उपसर्ग करना (इसलिए वर्ष 10 30 का प्रतिनिधित्व किया जाता है^A1000000000000000000000000000000
, और वर्ष 10 31 का प्रतिनिधित्व किया जाता है द्वारा^B10000000000000000000000000000000
)। - वर्ष 10 56 56 से 10 732 : वर्ष दो देखभाल और दो ASCII अपरकेस अक्षरों द्वारा उपसर्ग है। अपरकेस अक्षर वर्ष में अंकों की संख्या का प्रतिनिधित्व करते हुए एक आधार -26 संख्या बनाते हैं, माइनस 57।
- वर्ष 10 732 बाद में: 10 56 से 10 732 के लिए एक ही प्रारूप का उपयोग किया जाता है, जब आवश्यक हो तो एक अतिरिक्त कैरेट और अपरकेस पत्र जोड़कर इसे विस्तारित किया जाता है।
- BCE वर्ष (वर्ष 0 से पहले): वर्ष के निरपेक्ष मान के वर्ष स्ट्रिंग की गणना करें। फिर, सभी अक्षरों को उनके आधार -26 पूरक (A <-> Z, B <-> Y, आदि) द्वारा प्रतिस्थापित करें, सभी अंकों को उनके आधार -10 पूरक (0 <-> 9, 1 <-> 8) से बदलें आदि), और विस्मयादिबोधक चिह्न (
!
) के साथ कैरेट्स को बदलें । यदि वर्ष स्ट्रिंग 4 अंक या उससे कम (यानी -1 से -10,000) है, तो आगे की स्लैश (/
) को रोकें । यदि वर्ष स्ट्रिंग को आगे स्लैश या विस्मयादिबोधक चिह्न द्वारा उपसर्ग नहीं किया जाता है, तो तारांकन चिह्न (*
) को पूर्वस्थापित करें ।
- महीने, दिन, घंटे, मिनट और सेकंड : चूंकि ये मान केवल 2 अंकों में सबसे अधिक होते हैं, वे बस वर्ष स्ट्रिंग के दाईं ओर जोड़ दिए जाते हैं, महत्व के घटते क्रम में, यदि आवश्यक हो तो शून्य के साथ बाएं-पैडेड 2-अंकीय तार।
- अतिरिक्त परिशुद्धता : यदि अतिरिक्त परिशुद्धता (मिलीसेकंड, माइक्रोसेकंड, नैनोसेकंड, आदि के रूप में) की जरूरत है, तो उन मानों को शून्य से 3 अंकों के साथ छोड़ दिया जाता है (क्योंकि प्रत्येक मान
1/1000
पिछले मूल्य का है, और इस तरह सबसे अधिक है999
) और महत्व के घटते क्रम में टाइमस्टैम्प के अंत में संलग्न है।
इस प्रारूप में लेक्सिकल छँटाई का लाभ संबंधित टाइमस्टैम्प के संख्यात्मक छँटाई के बराबर है - यदि समय बी से पहले आता है, तो लेक्सिकल छँटाई लागू होने पर ए के लिए टाइमस्टैम्प बी के लिए टाइमस्टैम्प से पहले आएगा।
चुनौती
अंकीय मूल्यों की एक लंबी-लंबी सूची (महत्व के घटते क्रम में समय मान के अनुसार, उदाहरण के लिए [year, month, day, hour, minute, second, millisecond]
) को देखते हुए, संबंधित RFC 2550 टाइमस्टैम्प का उत्पादन करता है।
नियम
- समाधान किसी भी दिए गए इनपुट के लिए काम करना चाहिए। केवल सीमाएं समय और उपलब्ध स्मृति होनी चाहिए।
- इनपुट को किसी भी उचित, सुविधाजनक प्रारूप में लिया जा सकता है (जैसे संख्यात्मक की एक सूची, तार की एक सूची, एक एकल गैर-अंक चरित्र द्वारा सीमांकित स्ट्रिंग)।
- इनपुट में हमेशा कम से कम एक मान (वर्ष) होगा। अतिरिक्त मूल्य हमेशा महत्व के घटते क्रम में होते हैं (जैसे इनपुट में एक महीने के मूल्य के बिना एक दिन का मूल्य या महीने के मूल्य के बाद दूसरा मूल्य नहीं होगा)।
- इनपुट हमेशा एक वैध समय होगा (जैसे कि 30 फरवरी के लिए कोई टाइमस्टैम्प नहीं होगा)।
- आरएफसी 2550 टाइमस्टैम्प की गणना करने वाले बिल्डरों को मना किया जाता है।
उदाहरण
ये उदाहरण इनपुट को एक स्ट्रिंग के रूप में उपयोग करते हैं, जिसमें अलग-अलग मूल्य अवधि ( .
) से अलग होते हैं ।
1000.12.31.13.45.16.8 -> 10001231134516008
12.1.5.1 -> 0012010501
45941 -> A45941
8675309.11.16 -> C86753091116
47883552573911529811831375872990.1.1.2.3.5.8.13 -> ^B478835525739115298118313758729900101020305008013
4052107100422150625478207675901330514555829957419806023121389455865117429470888094459661251.2.3.5.7.11 -> ^^BI40521071004221506254782076759013305145558299574198060231213894558651174294708880944596612510203050711
-696443266.1.3.6.10.15.21.28 -> *V3035567330103061015021028
-5342 -> /4657
-4458159579886412234725624633605648497202 -> !Q5541840420113587765274375366394351502797
संदर्भ कार्यान्वयन
#!/usr/bin/env python
import string
# thanks to Leaky Nun for help with this
def base26(n):
if n == 0:
return ''
digits = []
while n:
n -= 1
n, digit = divmod(n, 26)
digit += 1
if digit < 0:
n += 1
digit -= 26
digits.append(digit)
return ''.join(string.ascii_uppercase[x-1] for x in digits[::-1])
year, *vals = input().split('.')
res = ""
negative = False
if year[0] == '-':
negative = True
year = year[1:]
if len(year) < 5:
y = "{0:0>4}".format(year)
elif len(year) <= 30:
y = "{0}{1}".format(string.ascii_uppercase[len(year)-5], year)
else:
b26len = base26(len(year)-30)
y = "{0}{1}{2}".format('^'*len(b26len), b26len, year)
if negative:
y = y.translate(str.maketrans(string.ascii_uppercase+string.digits+'^', string.ascii_uppercase[::-1]+string.digits[::-1]+'!'))
if len(year) == 4:
y = '/' + y
if y[0] not in ['/', '!']:
y = '*' + y
res += y
for val in vals[:5]: #month, day, hour, minute, second
res += '{0:0>2}'.format(val)
for val in vals[5:]: #fractional seconds
res += '{0:0>3}'.format(val)
print(res)
-696443266.1.3.6.10.15.21.28
होना चाहिए*V3035567339896938984978971
?