W latach 90. inżynierowie COBOL opracowali sposób rozszerzenia sześciocyfrowych pól daty, przekształcając je YYYDDD
tam, gdzie YYY
jest year - 1900
i gdzie jest DDD
dzień roku [001 to 366]
. Ten schemat może przedłużyć maksymalny termin do 2899-12-31
.
W roku 2898 inżynierowie zaczęli panikować, ponieważ ich 900-letnie bazy kodów uległy awarii. Będąc od roku 2898, właśnie wykorzystali swój wehikuł czasu, aby wysłać samotnego Codeinatora do roku 1998 z tym algorytmem i zadaniem jego wdrożenia w jak najszerszym zakresie:
Użyj schematu
PPQQRR
gdzie jeśli01 ≤ QQ ≤ 12
to jest to standardowyYYMMDD
termin w 1900, ale czyQQ > 12
to oznacza dni po2000-01-01
w bazie 100 dlaPP
aRR
jednak podstawy 87 zaQQ - 13
.
Program ten wykracza daleko poza rok 2899 i jest również wstecznie zgodny ze standardowymi datami, więc nie są wymagane modyfikacje istniejących archiwów.
Kilka przykładów:
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
Wyzwanie polega na napisaniu programu lub funkcji, która będzie akceptować dane wejściowe PPQQRR
i wyjściowe jako datę ISO YYYY-MM-DD
. Metodą wprowadzania może być parametr, konsola lub wiersz poleceń, cokolwiek jest najłatwiejsze.
Dla twojej rozrywki, oto niekonkurencyjne rozwiązanie w 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
nie działa przez lata>=2000
, to jest sedno klęski Y2K.yyyy-mm-dd
formacie ISO .001300
.Odpowiedzi:
T-SQL,
9998 bajtówPodział linii służy wyłącznie do odczytu. Dzięki Bogu za niejawne rzucanie.
Dane wejściowe pochodzą z wcześniej istniejącej tabeli t z
CHAR
kolumną i , zgodnie z naszymi zasadami IO .Wykonuje następujące kroki:
ISDATE()
. (Zachowanie tej funkcji zmienia się w zależności od ustawień języka, działa zgodnie z oczekiwaniami na moimenglish-us
serwerze). Zauważ, że jest to tylko sprawdzenie poprawności, jeśli spróbujemy go bezpośrednio250101
parsować, zostanie zmapowany jako 2025-01-01, a nie 1925-01-01.19
z przodu (zamiast zmieniać ustawienie wartości odcięcia roku na poziomie serwera). Ostateczna konwersja daty nastąpi na końcu.8700*PP + QQRR - 1300
uniknąć (bardzo długiej)SUBSTRING()
funkcji SQL . Ta matematyka sprawdza dostarczone próbki, jestem prawie pewien, że ma rację.DATEADD
aby dodać tyle dni, do2000-01-01
których można skrócić2000
.CONVERT()
to na czystoDATE
.Myślałem, że w pewnym momencie znalazłem problematyczny termin:
000229
. Jest to jedyna data, która analizuje inaczej dla 19xx i 20xx (od 2000 roku był rok przestępny, ale 1900 nie był, z powodu dziwnych wyjątków z roku przestępnego ). Z tego powodu jednak000229
nie jest to nawet prawidłowy wkład (ponieważ, jak wspomniano, 1900 nie był rokiem przestępnym), więc nie trzeba go uwzględniać.źródło
ISDATE
że nie zwraca wartości logicznej, ani że liczb całkowitych nie można niejawnie przekonwertować na wartość logiczną, wIIF
przeciwnym razie można zapisać dwa bajty.LEFT()
iRIGHT()
funkcji na liczby całkowite przed ich pomnożeniem, co naprawdę pomieszałoby moją liczbę bajtów-1300,'2000'
ją-935,'1999'
.R , 126 bajtów
Wypróbuj online!
źródło
000101
Lub681231
)JavaScript (SpiderMonkey) , 103 bajty
Wypróbuj online!
.toJSON
zawiedzie w strefie czasowej UTC + X. Ten kod działa, ale dłużej (+ 11 bajtów):źródło
.toJSON()
.Python 2 , 159 bajtów
Wypróbuj online!
źródło
... and ... or ...
zamiast... if ... else ...
.ABAP,
173171 bajtówZaoszczędzono 2 bajty dzięki dalszej optymalizacji danych wyjściowych
Według legend klient SAP na początku XXI wieku powiedział kiedyś:
On miał rację. Dzisiaj, w 2980 roku, nie ma już C ++, nie ma już COBOL. Po wojnie wszyscy musieli przepisać swój kod w SAP ABAP. Aby zapewnić zgodność wsteczną z resztkami programów COBOL 2800, nasi naukowcy przebudowali go jako podprogram w ABAP.
Może być wywołany przez taki program:
Objaśnienie mojego kodu:
Typ daty ABAP ma właściwość nieparzystą, którą należy sformatować jako DDMMRRRRR
WRITE
- może być zależna nawet od ustawień regionalnych - mimo że format wewnętrzny to RRRRMMDD. Ale kiedy używamy selektora podciągów, taki jakd(4)
on, wybiera pierwsze 4 znaki wewnętrznego formatu , co daje nam RRRR.Aktualizacja : Formatowanie wyjściowe w wyjaśnieniu jest teraz nieaktualne, zoptymalizowałem go o 2 bajty w wersji golfowej:
źródło
MUMPS
i przetrwamy wszystko!Kotlin , 222 bajty
Zakodowane na stałe nazwy pól kalendarza pozwalają zaoszczędzić 49 bajtów.
Wypróbuj online!
źródło