- 23, Oct 2024
- #1
РФК 2550 - это сатирическое предложение (опубликовано 1 апреля 1999 г.) по созданию компактного ASCII-представления временных меток, которое может поддерживать любую дату (даже те, что были до начала Вселенной и те, что прошли после предсказанного конца Вселенной). Алгоритм вычисления временной метки, соответствующей RFC 2550, следующий (примечание: все диапазоны включают начало, но исключают конец — от 0 до 10 000 означают все
where#!/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)
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
):
- Формат года
- Годы от 0 до 10 000: четырехзначное десятичное число, дополненное нулями слева.
- Годы от 10 000 до 100 000: пятизначное десятичное число с префиксом символа А.
- Лет от 100 000 до 1030: десятичное число года с префиксом заглавной буквы ASCII, индекс которой в английском алфавите равен количеству цифр в десятичном году минус 5 (B для 6-значных лет, C для 7-значных лет и т. д.). .).
- Лет 1030 до 1056: тот же формат, что и от 10 000 до 10.30, начиная буквы с A и дополнительно добавляя префикс курсора (
.
) to the string (so the year 1030 представлен[year, month, day, hour, minute, second, millisecond]
, and the year 1031 представлен999
). - Лет 1056 до 10732: год начинается с двух кареток и двух заглавных букв ASCII. Заглавные буквы образуют число по основанию 26, представляющее количество цифр года минус 57.
- Лет 10732 и далее: тот же формат для 1056 до 10732 используется, расширяя его, добавляя при необходимости дополнительную букву курсора и прописную букву.
- Годы до нашей эры (до года 0): вычислите строку года абсолютного значения года. Затем замените все буквы их дополнением по основанию 26 (A <-> Z, B <-> Y и т. д.), замените все цифры их дополнением по основанию 10 (0 <-> 9, 1 <-> 8, и т. д.) и замените каретки восклицательными знаками (
1/1000
). If the year string is 4 digits or less (i.e. -1 to -10,000), prepend a forward slash (*
). Если строка года не начинается с косой черты или восклицательного знака, добавьте звездочку (/
). - Месяцы, дни, часы, минуты и секунды: поскольку эти значения состоят максимум из двух цифр, они просто добавляются справа от строки года в порядке убывания значимости, дополняя их слева нулями, если необходимо, для формирования двухзначных строк.
- Дополнительная точность: если необходима дополнительная точность (в виде миллисекунд, микросекунд, наносекунд и т. д.), эти значения дополняются слева нулями до 3 цифр (поскольку каждое значение
!
of the previous value, and thus is at most^B10000000000000000000000000000000
) и добавляется в конец метки времени в порядке убывания значимости.
Преимущество этого формата заключается в том, что лексическая сортировка эквивалентна числовой сортировке соответствующей временной метки: если время A предшествует времени B, то при применении лексической сортировки временная метка для A будет предшествовать временной метке для B.
##Вызов
Учитывая произвольно длинный список числовых значений (соответствующих значениям времени в порядке убывания значимости, например ^A1000000000000000000000000000000
), output the corresponding RFC 2550 timestamp.
##Правила
- Решения должны работать для любого заданного ввода. Единственными ограничениями должны быть время и доступная память.
- Ввод может быть принят в любом разумном и удобном формате (например, список чисел, список строк, строка, разделенная одним нецифровым символом и т. д.).
- Входные данные всегда будут содержать хотя бы одно значение (год). Дополнительные значения всегда располагаются в порядке убывания значимости (например, входные данные никогда не будут содержать значение дня без значения месяца или второе значение, за которым следует значение месяца).
- Введенное время всегда будет действительным (например, для 30 февраля не будет никаких меток времени).
- Встроенные функции, вычисляющие временные метки RFC 2550, запрещены.
##Примеры
В этих примерах входные данные используются в виде одной строки с отдельными значениями, разделенными точками ( ^
).
0 <= n < 10000
##Эталонная реализация
n
#код-гольф #строка #дата