আরএফসি 2550 হ'ল একটি ব্যঙ্গাত্মক প্রস্তাব (1 এপ্রিল, 1999 এ প্রকাশিত) একটি স্থান-দক্ষ এএসসিআইআইয়ের টাইমস্ট্যাম্পগুলির উপস্থাপনা যা কোনও তারিখকে সমর্থন করতে পারে (এমনকি মহাবিশ্বের সূচনার পূর্বে এবং মহাবিশ্বের পূর্বাভাসের শেষেরগুলি যারা)। একটি আরএফসি 2550- কমপ্লায়েন্ট টাইমস্ট্যাম্প গণনা করার জন্য অ্যালগরিদম নিম্নরূপ (দ্রষ্টব্য: সমস্ত রেঞ্জের শুরুটি অন্তর্ভুক্ত রয়েছে তবে শেষটি বাদ নেই - 0 থেকে 10,000 এর অর্থ সমস্ত n
যেখানে রয়েছে 0 <= n < 10000
):
- বছরের ফর্ম্যাট
- বছর 0 থেকে 10,000: 4-অঙ্কের দশমিক সংখ্যা, শূন্য সহ বাম-প্যাডযুক্ত।
- বছর 10,000 থেকে 100,000: এ অক্ষরের সাথে উপসর্গযুক্ত একটি 5-অঙ্কের দশমিক সংখ্যা
- বছর 100,000 থেকে 10 30 : বছরের দশমিক সংখ্যা, বড় হাতের ASCII চিঠির সাথে উপসর্গযুক্ত, যার ইংরেজি বর্ণমালায় সূচক দশমিক বছরে অঙ্ক সংখ্যার সমান, বিয়োগ 5 (6-সংখ্যার জন্য বি, 7 এর জন্য সি) -ডিজিট বছর, ইত্যাদি)।
- বছর 10 30 থেকে 10 56 : 10,000 থেকে 10 30 এর একই ফর্ম্যাটটি , এ এর সাথে অক্ষরগুলি শুরু করে এবং একটি কেরেটের (
^
স্ট্রিং) উপসর্গ করে (সুতরাং বছর 30 30 প্রতিনিধিত্ব করে^A1000000000000000000000000000000
, এবং বছর 10 31 প্রতিনিধিত্ব করে) দ্বারা^B10000000000000000000000000000000
)। - বছর 10 56 থেকে 10 732 : বছরটি দুটি কেরেট এবং দুটি এএসসিআইআই বড় হাতের অক্ষর দ্বারা উপস্থাপিত হয়। বড় হাতের অক্ষরগুলি একটি বেস -26 সংখ্যা গঠন করে, বছরটিতে সংখ্যার সংখ্যাটি উপস্থাপন করে, বিয়োগ 57।
- বছর 10 732 এর পরে: 10 56 থেকে 10 732 এর জন্য একই ফর্ম্যাটটি ব্যবহৃত হয়, যখন প্রয়োজন হয় তখন অতিরিক্ত ক্যারেট এবং বড় হাতের অক্ষর যুক্ত করে এটি প্রসারিত করা হয়।
- বিসিই বছর (0 বছর পূর্বে): বছরের পরম মানের বছরের স্ট্রিং গণনা করুন। তারপরে সমস্ত অক্ষরকে তাদের বেস -26 পরিপূরক (A <-> Z, B <-> Y, ইত্যাদি) দ্বারা প্রতিস্থাপন করুন, সমস্ত সংখ্যাগুলি তাদের বেস -10 পরিপূরক দ্বারা প্রতিস্থাপন করুন (0 <-> 9, 1 <-> 8, ইত্যাদি) এবং বিস্ময়কর চিহ্নগুলি (
!
) দিয়ে কেরেটগুলি প্রতিস্থাপন করুন । যদি বছরের স্ট্রিং 4 ডিজিট বা তার চেয়ে কম হয় (যেমন -1 থেকে -10,000), একটি ফরোয়ার্ড স্ল্যাশ (/
) প্রিপেন্ড করুন । যদি বছরের স্ট্রিংটি ফরোয়ার্ড স্ল্যাশ বা বিস্ময়কর চিহ্ন দ্বারা উপসর্গ করা না হয়, একটি তারকাচিহ্ন (*
) পূর্বে চাপ দিন ।
- মাস, দিন, ঘন্টা, মিনিট, এবং সেকেন্ড : যেহেতু এই মানগুলি সর্বাধিক মাত্র 2 অঙ্ক থাকে তাই এগুলি কেবল বছরের স্ট্রিংয়ের ডানদিকে যুক্ত হয়, তাত্পর্য হ্রাসের ক্রমে, বাম-প্যাডযুক্ত শূন্যগুলির সাথে গঠনের প্রয়োজনে 2-অঙ্কের স্ট্রিং
- অতিরিক্ত নির্ভুলতা : যদি অতিরিক্ত যথার্থতা (মিলিসেকেন্ড, মাইক্রোসেকেন্ডস, ন্যানোসেকেন্ডস ইত্যাদির আকারে) প্রয়োজন হয় তবে সেই মানগুলি 3 টি অঙ্কে শূন্যের সাথে বাম-প্যাডযুক্ত থাকে (কারণ প্রতিটি মান
1/1000
পূর্ববর্তী মানের হয়, এবং এইভাবে সর্বাধিক হয়999
) এবং টাইমস্ট্যাম্পের শেষে সংযোজন করে তাত্পর্যপূর্ণ হ্রাস করে।
এই টাইমস্ট্যাম্পের সাংখ্যিক বাছাইয়ের সমতুল্য লেক্সিকাল বাছাইয়ের সুবিধা রয়েছে - যদি সময় এ-এর আগে খ আসে, তখন লে এর লম্বিক বাছাইয়ের সময় A এর টাইমস্ট্যাম্প আসবে for
চ্যালেঞ্জ
সংখ্যাসূচক মানের একটি দীর্ঘ-তালিকা দেওয়া হয়েছে (তাত্পর্যপূর্ণ ক্রমান্বিত সময়ের মান অনুসারে, যেমন [year, month, day, hour, minute, second, millisecond]
), সম্পর্কিত আরএফসি 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
?