RFC 2550 은 우주를 시작하기 전의 날짜와 우주의 예상 끝을 지나친 날짜를 지원할 수있는 공간 효율적인 ASCII 타임 스탬프의 ASCII 표현에 대한 풍자 제안 (1999 년 4 월 1 일에 게시)입니다. RFC 2550 호환 타임 스탬프를 계산하는 알고리즘은 다음과 같습니다 (참고 : 모든 범위는 시작을 포함하지만 끝을 제외합니다-0에서 10,000은 모두 n
여기서 의미 0 <= n < 10000
).
- 연도 형식
- Years 0-10,000 : 왼쪽에 0으로 채워지는 4 자리 10 진수입니다.
- 10,000 ~ 100,000 년 : 문자 A가 앞에 붙는 5 자리 10 진수
- 년 10-10 30 : 연도의 10 진수, 영어 알파벳의 색인이 10 년의 자릿수, 5를 뺀 5와 같은 대문자 ASCII 문자가 앞에 붙습니다 (7은 B, 6 자리는 C, 7은 C) -자리 연도 등).
- 년 10 30 10 56 10 10,000 같은 형식 : 30 , A를 통해 문자부터 추가적으로 캐럿 (접두어
^
년 10되도록 (문자열) (30) 로 표시^A1000000000000000000000000000000
하고, 연도 (10) (31)가 표시된다 에 의해^B10000000000000000000000000000000
). - Years 10 56 to 10 732 : 연도는 두 개의 캐럿과 두 개의 ASCII 대문자로 시작합니다. 대문자는 연도의 자릿수에서 빼기 (57)를 나타내는 밑이 26 인 숫자를 형성합니다.
- Year 10 732 이후 : 10 56 ~ 10 732 와 동일한 형식 이 사용되며 필요한 경우 추가 캐럿과 대문자를 추가하여 확장합니다.
- BCE 연도 (0 년 이전) : 연도 절대 값의 연도 문자열을 계산합니다. 그런 다음 모든 문자를 밑이 26 인 보수 (A <-> Z, B <-> Y 등)로 바꾸고, 모든 숫자를 밑이 10 인 보수 (0 <-> 9, 1 <-> 8, 캐럿을 느낌표 (
!
)로 바꿉니다 . 연도 문자열이 4 자리 이하 (예 : -1 ~ -10,000)이면 슬래시 (/
)를 추가하십시오 . 연도 문자열 앞에 슬래시 나 느낌표가 붙지 않으면 별표 (*
)를 추가하십시오 .
- 월, 일, 시간, 분 및 초 :이 값은 최대 2 자리 숫자이므로 연도의 오른쪽에 중요도의 내림차순으로 추가되며, 필요한 경우 0으로 왼쪽 채워집니다. 2 자리 문자열.
- 추가 정밀도 : 추가 정밀도 (밀리 초, 마이크로 초, 나노초 등의 형태)가 필요한 경우 해당 값은 0에서 3 자리로 채워집니다 (각 값은
1/1000
이전 값이므로 최대 값입니다999
). 타임 스탬프의 끝에 중요도의 내림차순으로 추가됩니다.
이 형식은 어휘 정렬이 해당 타임 스탬프의 숫자 정렬과 동등하다는 이점이 있습니다. 시간 A가 시간 B보다 먼저 오면 어휘 정렬이 적용될 때 A의 타임 스탬프가 B의 타임 스탬프보다 먼저 나옵니다.
도전
임의의 긴 숫자 값 목록 (예 : 중요도의 내림차순으로 시간 값에 해당)이 주어진 [year, month, day, hour, minute, second, millisecond]
경우 해당 RFC 2550 타임 스탬프를 출력합니다.
규칙
- 주어진 입력에 대해 솔루션이 작동해야합니다. 시간과 사용 가능한 메모리 만 제한해야합니다.
- 입력은 합리적이고 편리한 형식 (숫자 목록, 문자열 목록, 숫자가 아닌 단일 문자로 구분 된 문자열 등)으로 가져올 수 있습니다.
- 입력은 항상 하나 이상의 값 (연도)을 포함합니다. 추가 값은 항상 중요도의 내림차순으로 표시됩니다 (예 : 입력에 월 값이없는 일 값 또는 월 값 뒤에 두 번째 값이 포함되지 않음).
- 입력은 항상 유효한 시간입니다 (예 : 2 월 30 일의 타임 스탬프 없음).
- RFC 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
합니까?