В 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 .