Diberikan kode tanggal gaya Excel non-negatif integer, kembalikan "tanggal" yang sesuai dalam bentuk wajar apa pun yang dengan jelas menunjukkan tahun, bulan, dan "hari".
Sepele, Anda mungkin berpikir. Apakah Anda memperhatikan "kutipan menakut-nakuti"? Saya menggunakan itu karena Excel memiliki beberapa kebiasaan. Excel menghitung hari dengan nomor 1 untuk Januari 1 st , 1900, tetapi seolah 1900 memiliki 0 Januari th dan 29 Feb th , jadi sangat berhati-hati untuk mencoba semua kasus uji:
Input → Output (example format)
0 → 1900-01-00 Note: NOT 1899-12-31
1 → 1900-01-01
2 → 1900-01-02
59 → 1900-02-28
60 → 1900-02-29 Note: NOT 1900-03-01
61 → 1900-03-01
100 → 1900-04-09
1000 → 1902-09-26
10000 → 1927-05-18
100000 → 2173-10-14
DayOfWeek
metode karena zaman asli, 1899/12/30 (atau fiktif 1900-01-00) dipilih sedemikian rupa sehingga hari kerja hanyalah mod-7 dari jumlah hari, tetapi itu tidak akan bekerja dengan 1899-12-30.Jawaban:
Excel, 3 (+7?)
dengan format
Port murni
sumber
k (kdb + 3.5),
55545150 byteuntuk menguji, rekatkan baris ini di konsol q:
output seharusnya
{
}
adalah fungsi dengan argumenx
0 60?x
indeksx
antara0 60
atau 2 jika tidak ditemukanˋ1900.01.00ˋ1900.02.29
daftar dua simbol,
menambahkannya"d"$
dikonversi menjadi tanggalx-36526
jumlah hari sejak tahun 1900 (bukan standar 2000)- x<60
sesuaikan untuk kesalahan lompatan excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)
@0 60?x
juxtaposition berarti pengindeksan - "@" di tengahnya implisit$
dikonversi ke stringsumber
{$[x;$`d$x-65746;"1900.01.00"]}
sepertinya berfungsi . Saya berasumsi sesuatu meluap ke suatu tempat100000
.Python 2 , 111 byte
Cobalah online!
-5 Terima kasih kepada ngn .
sumber
JavaScript (ES6),
89 8277 byteDisimpan
712 byte berkat @tshCobalah online!
sumber
n=>n?n-60?new Date(1900,0,n-(n>60)).toJSON().slice(0,10):'1900-02-29':'1900-01-00'
new Date(0,0,1)
sama sajanew Date(1900,0,1)
. Jadi hapus190
save 3 byte. Dan ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
Bersih ,
205189 byteCobalah online!
sumber
Japt, 43 byte
Berakhir dengan port bagian dari solusi Arnauld .
Output dalam
yyyy-m-d
format.Cobalah online atau uji 0-100
sumber
APL (Dyalog Classic) , 31 byte
Fungsi awalan diam-diam anonim. Tanggal pengembalian sebagai
[Y,M,D]
Cobalah online!
×
tanda kode tanggal⊢-
kurangi itu dari argumen (kode tanggal)60∘>+
increment jika kode tanggal di atas enam puluh2⎕NQ#263,
gunakan itu sebagai argumen langsung untuk "Event 263" (IDN to date)IDN sama seperti kode tanggal Excel, tetapi tanpa 29 Februari 1900, dan sehari sebelum 1 Januari 1900 adalah 31 Desember 1899
3↑
ambil tiga elemen pertama dari itu (yang keempat adalah hari dalam seminggu)(
...)+
tambahkan yang berikut ke yang berikut:60∘≠
0 jika kode tanggal adalah 60; 1 jika kode tanggal bukan 60×-
kurangi itu dari tanda kode tanggal¯3↑
ambil tiga elemen terakhir (hanya ada satu) padding dengan (dua) noldikembangkan bersama dengan @Adám dalam obrolan
sumber
C # (.NET Core) ,
186185 byteCobalah online!
-1 byte dengan mengganti operator OR (||) dengan operator biner OR (|).
sumber
Perl 6 , 81 byte
Cobalah online!
sumber
T-SQL,
141 9594 byteLine break hanya untuk keterbacaan.
Input diambil melalui tabel i yang sudah ada sebelumnya dengan bidang bilangan bulat n , sesuai standar IO kami .
SQL menggunakan titik awal 1-1-1900 yang sama (tetapi diperbaiki) untuk format tanggal internal, jadi saya hanya perlu mengimbanginya dengan 1 atau 2 hari dalam
DATEADD
fungsi.SQL tidak dapat menampilkan kolom yang berisi campuran nilai tanggal dan karakter, jadi saya tidak bisa mengabaikan
FORMAT
perintah (karena itu akan mencoba untuk mengkonversi1/0/1900
ke tanggal, yang tentu saja tidak valid).Apa yang baik tentang SQL adalah bahwa saya dapat memuat semua nilai input ke dalam tabel dan menjalankan semuanya sekaligus. Lokalitas (AS) saya default ke
m/d/yyyy
format tanggal:EDIT : Disimpan 46 byte dengan mengubah menjadi bersarang
IIF()
alih-alih lebih banyak verboseCASE WHEN
.EDIT 2 : Menyimpan byte lain dengan menggerakkan bagian
-
depanIIF
.sumber