Pada 1990-an, insinyur komputer COBOL menemukan cara untuk memperluas bidang tanggal enam digit dengan mengonversinya ke YYYDDD
tempat YYY
adalah year - 1900
dan DDD
merupakan hari dalam setahun [001 to 366]
. Skema ini dapat memperpanjang tanggal maksimum ke 2899-12-31
.
Pada tahun 2898, para insinyur mulai panik karena basis kode 900 tahun mereka akan gagal. Dari tahun 2898, mereka hanya menggunakan mesin waktu mereka untuk mengirim Codeinator sendiri ke tahun 1998 dengan algoritma ini dan tugas untuk mengimplementasikannya seluas mungkin:
Gunakan skema di
PPQQRR
mana jika01 ≤ QQ ≤ 12
maka itu adalahYYMMDD
tanggal standar di tahun 1900-an, tetapi jikaQQ > 12
kemudian itu mewakili hari-hari setelahnya2000-01-01
di basis 100 untukPP
danRR
tetapi basis 87 untukQQ - 13
.
Skema ini melampaui tahun 2899 dan juga kompatibel dengan tanggal standar, jadi tidak diperlukan modifikasi arsip yang ada.
Beberapa contoh:
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
Tantangan Anda adalah menulis program atau fungsi untuk menerima input sebagai PPQQRR
dan output sebagai tanggal ISO YYYY-MM-DD
. Metode input dapat berupa parameter, konsol atau baris perintah, apa pun yang termudah.
Untuk hiburan Anda, berikut adalah solusi tidak bersaing di 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
tidak berfungsi selama bertahun-tahun>=2000
, itulah inti dari bencana Y2K.yyyy-mm-dd
format ISO .001300
.Jawaban:
T-SQL,
9998 bytesIstirahat baris hanya untuk keterbacaan. Terima kasih Tuhan atas casting implisit.
Input adalah melalui tabel t yang sudah ada sebelumnya dengan
CHAR
kolom i , sesuai aturan IO kami .Ikuti langkah-langkah berikut:
ISDATE()
. (Perilaku fungsi ini berubah berdasarkan pengaturan bahasa, berfungsi seperti yang diharapkan padaenglish-us
server saya ). Perhatikan bahwa ini hanya pemeriksaan validitas, jika kami mencoba menguraikannya secara langsung, ini akan dipetakan250101
sebagai 2025-01-01, bukan 1925-01-01.19
pada bagian depan (alih-alih ubah pengaturan cutoff tahun level server). Konversi tanggal akhir akan datang di akhir.8700*PP + QQRR - 1300
, yang menghindariSUBSTRING()
fungsi SQL (sangat panjang) . Matematika ini memeriksa sampel yang disediakan, saya cukup yakin itu benar.DATEADD
untuk menambahkan banyak hari2000-01-01
, yang dapat disingkat2000
.CONVERT()
itu menjadi murniDATE
.Saya pikir pada satu titik yang saya temukan tanggal bermasalah:
000229
. Ini adalah satu-satunya tanggal yang mem-parsing berbeda untuk 19xx vs 20xx (sejak tahun 2000 adalah tahun kabisat, tetapi tahun 1900 tidak, karena pengecualian tahun kabisat yang aneh ). Karena itu, meskipun,000229
bahkan bukan input yang valid (karena, sebagaimana disebutkan, 1900 bukan tahun kabisat), jadi tidak harus diperhitungkan.sumber
ISDATE
sekali tidak mengembalikan boolean, atau integer tidak dapat secara implisit dikonversi menjadi booleanIIF
jika tidak, Anda dapat menyimpan dua byte.LEFT()
danRIGHT()
ke bilangan bulat sebelum mengalikannya, itu akan benar-benar mengacaukan jumlah byte saya-1300,'2000'
dengan-935,'1999'
.R , 126 byte
Cobalah online!
sumber
000101
Atau681231
)JavaScript (SpiderMonkey) , 103 byte
Cobalah online!
.toJSON
akan gagal pada zona waktu UTC + X. Kode ini berfungsi, tetapi lebih lama (+ 11 byte):sumber
.toJSON()
.Python 2 , 159 byte
Cobalah online!
sumber
... and ... or ...
alih-alih... if ... else ...
.ABAP,
173171 byteDisimpan 2 byte dengan lebih mengoptimalkan output
Menurut legenda, seorang pelanggan SAP di awal abad ke-21 pernah berkata:
Dia benar. Hari ini, pada 2980, tidak ada lagi C ++, tidak ada lagi COBOL. Setelah perang semua orang harus menulis ulang kode mereka dalam SAP ABAP. Untuk memberikan kompatibilitas ke belakang pada sisa-sisa program COBOL 2800, para ilmuwan kami membangunnya kembali sebagai subrutin di ABAP.
Itu bisa dipanggil oleh program seperti ini:
Penjelasan kode saya:
Tipe Tanggal ABAP memiliki properti ganjil yang akan diformat sebagai DDMMYYYY saat menggunakan
WRITE
- bahkan mungkin bergantung pada lokal - meskipun format internal YYYYMMDD. Tetapi ketika kita menggunakan pemilih substring sepertid(4)
itu memilih 4 karakter pertama dari format internal , maka memberi kita YYYY.Pembaruan : Pemformatan keluaran dalam penjelasan sekarang kedaluwarsa, saya mengoptimalkannya dengan 2 byte dalam versi golf:
sumber
MUMPS
dan kita akan selamat dari apapun!Kotlin , 222 byte
Konstanta bidang Kalender nama kode keras untuk menyimpan 49 byte.
Cobalah online!
sumber