В 1990 - х годах, COBOL компьютерные инженеры разработали способ продлить шесть цифр полой даты путем преобразования их в YYYDDD
где YYY
это year - 1900
и DDD
есть день года [001 to 366]
. Эта схема может продлить максимальную дату до 2899-12-31
.
В 2898 году инженеры начали паниковать, потому что их 900-летние базы кода потерпели неудачу. Начиная с 2898 года, они просто использовали свою машину времени, чтобы отправить одинокий Codeinator в 1998 год с этим алгоритмом и задачей его реализации как можно шире:
Используйте схему,
PPQQRR
где, если01 ≤ QQ ≤ 12
тогда это стандартнаяYYMMDD
дата в 1900-х годах, но еслиQQ > 12
тогда, то она представляет дни после2000-01-01
в базе 100 дляPP
и вRR
базе 87 дляQQ - 13
.
Эта схема распространяется далеко за пределы 2899 года и также обратно совместима со стандартными датами, поэтому никаких изменений существующих архивов не требуется.
Некоторые примеры:
PPQQRR YYYY-MM-DD
000101 1900-01-01 -- minimum conventional date suggested by J. Allen
010101 1901-01-01 -- edge case suggested by J. Allen
681231 1968-12-31 -- as above
991231 1999-12-31 -- maximum conventional date
001300 2000-01-01 -- zero days after 2000-01-01
008059 2018-07-04 -- current date
378118 2899-12-31 -- maximum date using YYYDDD scheme
999999 4381-12-23 -- maximum date using PPQQRR scheme
Ваша задача состоит в том, чтобы написать программу или функцию, которая будет принимать ввод как PPQQRR
и выводить как дату ISO YYYY-MM-DD
. Метод ввода может быть параметром, консолью или командной строкой, что бы ни было проще.
Для вашего удовольствия, вот неконкурентное решение в COBOL-85:
IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-CONVERSION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 T PIC 9(8).
01 U PIC 9(8).
01 D VALUE '999999'.
05 P PIC 9(2).
05 Q PIC 9(2).
05 R PIC 9(2).
01 F.
05 Y PIC 9(4).
05 M PIC 9(2).
05 D PIC 9(2).
PROCEDURE DIVISION.
IF Q OF D > 12 THEN
MOVE FUNCTION INTEGER-OF-DATE(20000101) TO T
COMPUTE U = R OF D + 100 * ((Q OF D - 13) + 87 * P OF D) + T
MOVE FUNCTION DATE-OF-INTEGER(U) TO F
DISPLAY "Date: " Y OF F "-" M OF F "-" D OF F
ELSE
DISPLAY "Date: 19" P OF D "-" Q OF D "-" R OF D
END-IF.
STOP RUN.
yymmdd
что годами не работает>=2000
, вот и весь смысл фиаско Y2K.yyyy-mm-dd
формате ISO .001300
.Ответы:
T-SQL,
9998 байтРазрыв строки предназначен только для удобства чтения. Слава Богу за неявное приведение.
Ввод осуществляется с уже существующей таблицей т с
CHAR
колонкой I , в соответствии с нашими правилами ввода - вывода .Проходит следующие шаги:
ISDATE()
. (Поведение этой функции изменяется в зависимости от языковых настроек, на моемenglish-us
сервере она работает как положено ). Обратите внимание, что это всего лишь проверка на достоверность, если мы попытаемся проанализировать ее напрямую, она будет отображаться250101
как 2025-01-01, а не 1925-01-01.19
переднего плана (а не изменяйте настройку отсечения года на уровне сервера). Конечная дата конвертации придет в конце.8700*PP + QQRR - 1300
исключена (очень длинная)SUBSTRING()
функция SQL . Эта математика проверяет предоставленные образцы, я уверен, что это правильно.DATEADD
чтобы добавить столько дней2000-01-01
, которые можно закорочить2000
.CONVERT()
он в чистом видеDATE
.В какой-то момент я подумал, что нашел проблемную дату
000229
. Это единственная дата, которая по- разному анализируется для 19xx и 20xx (с 2000 года был високосный год, а 1900 - нет, из-за странных исключений високосного года ). Из-за этого, тем не менее,000229
даже не является действительным вкладом (поскольку, как уже упоминалось, 1900 год не был високосным годом), поэтому его не нужно учитывать.источник
ISDATE
не возвращает логическое значение, или целые числа не могут быть неявно преобразованы в булево вIIF
противном случае вы можете сохранить два байта.LEFT()
иRIGHT()
результаты функций к целым числам, прежде чем их умножить, это действительно испортило бы мой счетчик байтов-1300,'2000'
на-935,'1999'
.R , 126 байт
Попробуйте онлайн!
источник
000101
или681231
)JavaScript (SpiderMonkey) , 103 байта
Попробуйте онлайн!
.toJSON
произойдет сбой в часовом поясе UTC + X. Этот код работает, но длиннее (+ 11 байт):источник
.toJSON()
.Python 2 , 159 байт
Попробуйте онлайн!
источник
... and ... or ...
вместо... if ... else ...
.ABAP,
173171 байтСохранено 2 байта за счет дальнейшей оптимизации вывода
Согласно легендам, клиент SAP в начале 21-го века однажды сказал:
Он был прав. Сегодня, в 2980 году, больше нет C ++, больше нет COBOL. После войны все должны были переписать свой код в SAP ABAP. Чтобы обеспечить обратную совместимость с остатками программ COBOL 2800-х годов, наши ученые перестроили его в качестве подпрограммы в ABAP.
Он может быть вызван такой программой:
Объяснение моего кода:
Тип Date в ABAP имеет нечетное свойство, которое при форматировании должно быть отформатировано как DDMMYYYY,
WRITE
может зависеть даже от локали, несмотря на то, что внутренним форматом является YYYYMMDD. Но когда мы используем селектор подстроки,d(4)
он выбирает первые 4 символа внутреннего формата, что дает нам YYYY.Обновление : форматирование вывода в объяснении устарело, я оптимизировал его на 2 байта в версии для гольфа:
источник
MUMPS
и мы выживем во всем!Котлин , 222 байта
Жестко запрограммированные константы имен полей календаря для сохранения 49 байтов.
Попробуйте онлайн!
источник