Ubah format tanggal pendek menjadi tanggal panjang Inggris dalam sesedikit mungkin byte.
Memasukkan
Input akan berupa string dengan format yyyy-mm-dd
,, dengan nol bantalan opsional untuk semua nilai. Anda dapat berasumsi bahwa ini secara sintaksis benar, tetapi tidak harus tanggal yang valid. Nilai tahun negatif tidak perlu didukung.
Keluaran
Anda harus mengubah tanggal menjadi format tanggal panjang bahasa Inggris (mis 14th February 2017
.). Tidak ada bantalan di sini.
Jika tanggal tidak valid (mis. 2011-02-29
), Maka ini harus dikenali dengan beberapa cara. Melempar pengecualian diperbolehkan.
Lebih banyak contoh dapat dilihat di bawah ini.
Uji Kasus
"1980-05-12" -> 12th May 1980
"2005-12-3" -> 3rd December 2005
"150-4-21" -> 21st April 150
"2011-2-29" -> (error/invalid)
"1999-10-35" -> (error/invalid)
code-golf
date
conversion
GarethPW
sumber
sumber
03rd
bukannya3rd
2016-2-29
?Jawaban:
PostgreSQL, 61 karakter
Pernyataan siap, mengambil input sebagai parameter.
Contoh dijalankan:
sumber
Python 3.6,
137129 byteCobalah online!
sumber
%-d
adalah versi tanpa-padding%d
yang bisa Anda gunakan dalam pemformatan string Anda{g[2]}
. Juga,12
harus menjadi12th
, bukan12nd
(angka 10-19 tidak mengikuti aturan yang sama dengan 1-9 dan 20+)f
senarnyaJavaScript (ES6),
142140 byteKeluaran
NaNth Invalid Date
untuk tanggal yang tidak valid.Kode untuk nomor urut diadaptasi dari jawaban ini .
Tampilkan cuplikan kode
sumber
Python 3.6 , 154 byte
Cobalah online!(Atur aliran input dan kemudian jalankan.)
Terima kasih atas saran bagus dari komentator di bawah ini.
sumber
int(x)
danfor
di daftar comp Anda.(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')
bukannya kondisi Anda saat ini untuk -3 byte.(3<b<21)+(23<b<31)
untuk -1 byte. Cobalah online!PHP, 87 byte
Jalankan sebagai pipa dengan
-F
atau uji secara online . Selalu mencetak tahun 4 digit; gagal selama bertahun-tahun> 9999.tidak ada pemeriksaan validitas, 35 byte:
sumber
Bash + coreutils,
11578Cobalah online .
sumber
f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
.C #,
147143 byteDisimpan 4 byte berkat @The_Lone_Devil.
sumber
t.Day
dengand
tabungan 4 byte?mIRC versi 7.49 (197 byte)
sumber
Ruby ,
104103102 + 8 =112111110 byteMenggunakan
-rdate -p
bendera program.-1 byte dari manatwork.
Cobalah online!
sumber
d<4||d>20?"..stndrd"[d%10*2,2]:"th"
26
akan mencoba mengakses indeks12..13
dalam string pencarian, yang di luar batas, dan dengan demikian kembalinil
. Jadi menggunakan ternary membuatnyad<4||d>20?"..stndrd"[d%10*2,2]||"th":"th"
, yang lebih panjang 2 byte."th"
→:th
.C # (.NET Core) ,
167197 byteCobalah online!
+30 byte untuk
using System;
DateTime.Parse()
sumber
!
byte -1. Dan Anda dapat mengubah&&
ke&
untuk -3 byte. Juga, karena Anda menggunakans.Day
7 kali menghemat beberapa byte untuk membuat nilai temp untuk itu:s=>{var t=s.Day;return s.Equals(DateTime.MinValue)?"":t+((t%10==1&t!=11)?"st":(t%10==2&t!=12)?"nd":(t%10==3&t!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year;}
using System;
atau sepenuhnya memenuhi syaratDateTime
objek.DateTime.MinValue
adalah1-1-1
jadi saya tidak berpikir Anda perlu cek. Yang juga akan membuat poin saya sebelumnya tidak relevan.DateTime
dan menguraikan di luar metode tidak dapat diterima, Anda harus melakukan semua pekerjaan di dalam metode. Atau tambahkan metode tambahan untuk memisahkan pekerjaan.Excel, 212 byte
Jika Anda memecahnya menjadi potongan-potongan di setiap ampersand, Anda mendapatkan potongan-potongan ini:
ABS()
menarik nomor hari dari dua karakter terakhir dalam string. Karena itu mungkin termasuk tanda hubung,ABS
mengubahnya menjadi positif.IF((ABS-12)<2,"th",SWITCH())
tambah ordinal. The-12
bit adalah karena 11, 12, dan 13 tidak mengikuti aturan yang normal dan mereka semua mendapatkanth
bukanst
,nd
, danrd
. Ini mengoreksi untuk itu.SWITCH
Fungsi ini hanya tersedia di Excel 2016 dan yang lebih baru. ( Sumber ) Lebih pendek daripadaCHOOSE
dalam kasus ini karena dapat mengembalikan nilai jika tidak ada kecocokan yang ditemukan sedangkanCHOOSE
memerlukan input numerik dan harus memiliki pengembalian yang sesuai untuk setiap nilai yang mungkin.TEXT(MID()*30," mmmm ")
ekstrak nama bulan.MID()
mengeluarkan angka bulan sebagai string dan mengalikannya dengan 30 mengembalikan angka. Excel melihat angka itu sebagai tanggal (1900-01-30, 1900-02-29, 1900-03-30, dll.) DanTEXT()
memformatnya sebagai nama bulan dengan spasi di kedua ujungnya. 28 dan 29 juga berfungsi tetapi 30 terlihat "lebih bagus".LEFT()
ekstrak nomor tahun.Sekarang, mengingat semua itu, akan jauh lebih mudah jika kasus uji semua dalam rentang tanggal yang dapat ditangani Excel sebagai tanggal aktual: 1900-01-01 hingga 9999-12-31. Keuntungan besar adalah bahwa seluruh tanggal diformat sekaligus. Solusi itu adalah 133 byte :
Rintangan besar lainnya adalah harus memasukkan ordinal. Tanpa itu, solusinya hanya 34 byte :
sumber
Swift 3: 298 bytes
Cobalah online!
sumber
# Language, N bytes
. Akan lebih baik jika Anda bisa menambahkannya juga.T-SQL, 194 byte
Input melalui kolom teks i pada tabel t yang sudah ada , sesuai standar IO kami .
Bekerja untuk tanggal mulai 1 Januari 0001 hingga 31 Desember 9999. Tahun ini merupakan keluaran dengan setidaknya 3 digit (per 150AD contoh).
Tanggal yang tidak valid akan menghasilkan kesalahan jelek berikut:
Pengaturan bahasa / budaya default yang berbeda dapat mengubah perilaku ini. Jika Anda ingin output kesalahan yang sedikit lebih anggun (NULL), tambahkan 4 byte dengan mengubah
PARSE()
keTRY_PARSE()
.Format dan penjelasan:
The
DATE
tipe data yang diperkenalkan di SQL 2008 memungkinkan jangkauan yang lebih luas daripadaDATETIME
, dari 1 Jan 0001 sampai 31 Des 9999.Beberapa tanggal yang sangat awal dapat diuraikan salah dengan pengaturan lokalitas AS saya ("01-02-03" menjadi "2 Januari 2003"), jadi saya menunggu beberapa nol tambahan sehingga ia tahu bahwa nilai pertama adalah tahun.
Setelah itu, itu hanya
CASE
pernyataan berantakan untuk menambahkan akhiran ordinal ke hari itu. Mengganggu,FORMAT
perintah SQL tidak memiliki cara untuk melakukannya secara otomatis.sumber
q / kdb + 210 byte, tidak bersaing
Larutan:
Contoh:
Penjelasan:
Ini adalah tantangan yang mengerikan karena tidak ada format tanggal, jadi saya harus membuat bulan dari awal (95 byte) serta menghasilkan sufiks.
Solusi ungolfed di bawah, pada dasarnya membagi string input dan kemudian bergabung kembali bersama setelah kami menambahkan akhiran dan beralih bulan.
Catatan:
Tanggal di q hanya kembali ke ~ 1709 jadi saya tidak punya cara sepele untuk memvalidasi tanggal, maka ini adalah entri yang tidak bersaing ... Yang terbaik yang bisa saya lakukan adalah memeriksa apakah hari itu> 31 atau bulan adalah > 12 dan kembali 0.
sumber