Menyelesaikan Sengketa Format Tanggal

17

Urutan tanggal format adalah salah satu masalah paling kompleks dan memecah belah yang dihadapi dunia saat ini. Beberapa dari kita dengan keras berargumen bahwa Bulan / Hari / Tahun itu tepat, mengingat itulah cara kita mengatakan tanggal dengan keras. Yang lain dengan keras menyatakan bahwa Hari / Bulan / Tahun adalah yang terbaik, karena menempatkan syarat dalam urutan naik dari durasi yang mereka wakili.

Cukup sudah. Komputer dapat menyelesaikan perselisihan ini secara sederhana dan adil. Kode Anda, fungsi atau program lengkap, akan mengambil string tanggal yang dibatasi oleh garis miring, misalnya 12/1/2015. Perhatikan ini adalah format yang tepat, tanpa angka nol di depan dan dengan tahun empat digit di akhir.

  • Jika itu pasti Bulan / Hari / Tahun, mis. 10/31/1998, Tampilkan representasi teks dari tanggal tersebut dalam format yang tepat ini, dengan nama bulan penuh, hari, dan tahun:October 31, 1998
  • Jika itu pasti Hari / Bulan / Tahun, misalnya 25/12/1989, output jenis yang sama representasi teks: December 25, 1989.
  • Jika ambigu apakah Bulan / Hari / Tahun atau Hari / Bulan / Tahun, buat tanggal yang menyelesaikan ambiguitas dengan menggabungkan dua tanggal yang mungkin sebagai berikut:
    1. Buat nama bulan baru dengan mengambil paruh pertama nama bulan sebelumnya dan tambahkan paruh kedua bulan berikutnya . Selama berbulan-bulan dengan panjang ganjil, babak pertama mendapat surat tambahan. Untuk menjadi eksplisit, yang bagian pertama dari bulan yang Janu, Febr, Mar, Apr, Ma, Ju, Ju, Aug, Septe, Octo, Nove, dan Decedan oleh karena itu bagian kedua adalah ary, uary, ch, il, y, ne, ly, ust, mber, ber, mber, dan mber.
    2. Hitung hari dengan rata-rata dua hari yang mungkin, letakkan lantai ketika rata-rata bukan bilangan bulat.
    3. Keluarkan representasi teks dari tanggal ini, misalnya untuk 10/8/2011, keluaran Augber 9, 2011.

Jika tanggal input tidak boleh Bulan / Hari / Tahun atau Hari / Bulan / Tahun (misalnya 13/13/2013atau bahkan 2/30/2002), perilaku apa pun dapat diterima. Golf kode ini, kode terpendek menang!

Kasus uji:

10/31/1998 memberi October 31, 1998

25/12/1989 memberi December 25, 1989

10/8/2011 memberi Augber 9, 2011

8/5/1957 memberi Maust 6, 1957

9/12/2012 (anehnya) memberi September 10, 2012

1/1/2000 memberi January 1, 2000

Luke
sumber
20
Untuk apa nilainya, banyak dari mereka yang berdebat untuk hari-bulan-tahun juga mengatakan tanggal dalam urutan itu. (Tentu saja, Pemrogram Nyata berdebat untuk tahun-bulan-hari).
Peter Taylor
Hanya untuk memastikan: without leading zeroes and with a four-digit year at the endmenyiratkanyear >= 1000
edc65
Itu benar.
Lukas
1
+ ∞ untuk 10 September 2012
ev3commander

Jawaban:

1

Pyth - 156 byte

Benar-benar kode yang buruk, dan harus menggunakan string yang dikemas, tetapi ini sesuatu.

Kc"January February March April May June July August September October November December"dJhM.g>k12=GsMcz\/?<eJ32++@KthJdtP`,eJeGss[@VCcL2KStMPGdPt`,s.OPGeG

Test Suite .

Maltysen
sumber
3

Mathematica 341 304 298 288 293 bytes

Ini menggunakan fungsi murni atau anonim, yaitu fungsi tanpa namanya sendiri.

DateStringmengembalikan pesan kesalahan jika tanggalnya ambigu. Checkmenangkap ambiguitas dan mengirimkan tanggal menyinggung DateList, yang mengubahnya menjadi daftar 3 bilangan bulat (yang diyakini sebagai {year, month, day}). Bilangan bulat bulan dan hari diurutkan berdasarkan ukuran dan digunakan untuk menentukan bulan dan hari sesuai dengan instruksi OP.

Quiet pencetakan kesalahan hening.

t=StringSplit;v=ToString;x=t[#,"-"]&/@t["Janu-ary Febr-uary Mar-ch Apr-il Ma-y Ju-ne Ju-ly Aug-ust Septe-mber Octo-ber Nove-mber Dece-mber"];
Quiet@Check[#~DateString~{"MonthName"," ","DayShort",", ","Year"},
{m,n,o}=DateList@#;{p,q}=Sort@d[[2;;3]];x[[p,1]]<>x[[q,2]]<>" "<>v@Floor@Mean@{n,o}<>", "<>v@d[[1]]]&

t=StringSplit;v=ToString;x=t[#,"-"]&/@t["Janu-ary Febr-uary Mar-ch Apr-il Ma-y Ju-ne Ju-ly Aug-ust Septe-mber Octo-ber Nove-mber Dece-mber"];
Quiet@Check[#~DateString~{"MonthName"," ","DayShort",", ","Year"},
{m,n,o}=DateList@#;{p,q}=Sort@d[[2;;3]];x[[p,1]]<>x[[q,2]]<>" "<>v@Floor@Mean@{n,o}<>", "<>v@d[[1]]]& /@ 
{"10/31/1998","25/12/1989", "10/8/2011", "8/5/1957", "9/12/2012", "1/1/2012"}

{"31 Oktober 1998", "25 Desember 1989", "9 Agustus 2011", "6 Agustus 1957", "10 September 2012", "1 Januari 2012"}

DavidC
sumber
Saya pribadi akan senang melihat Anda menghilangkan 0 itu, tapi saya akan membiarkan suara jatuh sebanyak mungkin.
Luke
Sekarang mengembalikan "1 Januari 2012" seperti yang diminta.
DavidC
3

Javascript (ES6), 311 295 282 274 246 238 byte

a=>(a=a.split`/`,b=c=>e(c).length+1>>1,d=' ',e=f=>new Date(99,a[+f]-1).toLocaleString('en',{month:'long'}),g=+a[0],h=+a[1],i=g>h,j=g>12,k=h>12,(j&&!k?e(1)+d+g:k&&!j?e(0)+d+h:e(i).slice(0,b(i))+e(1-i).slice(b(1-i))+d+((g+h)>>1))+', '+a[2])

Sunting: Menggunakan toLocaleStringuntuk menghasilkan nama bulan. Ubah lokal untuk mendapatkan hasil menggunakan nama bulan di lokal yang berbeda!

Sunting 2: Sekarang menghasilkan dua nama bulan, bukan semua 12!

Tidak Disatukan:

func = inp => (
    inp = inp.split `/`,
    get = arg => months(arg).length + 1 >> 1,
    space = ' ',
    months = key => new Date(99, inp[+key] - 1).toLocaleString('en', { month: 'long' }),
    tmp1 = +inp[0],
    tmp2 = +inp[1],
    first = tmp1 > tmp2,
    t1greater = tmp1 > 12,
    t2greater = tmp2 > 12,
    (t1greater && !t2greater ?
        months(1) + space + tmp1
    :
        t2greater && !t1greater ?
            months(0) + space + tmp2
        :
            months(first).slice(0, get(first)) + months(1 - first).slice(get(1 - first)) + space + ((tmp1 + tmp2) >> 1)
    )
    + ', ' + inp[2]
)

Contoh:

console.log(
    func('10/31/1998') + '\n' +
    func('25/12/1989') + '\n' +
    func('10/8/2011') + '\n' +
    func('8/5/1957') + '\n' +
    func('9/12/2012') + '\n' +
    func('1/1/2000')
);

Terima kasih kepada:
@ user81655 , 274 => 246 byte
@ edc65 , 246 => 238 byte

kita dan teman
sumber
1
Saya belum melihat dengan saksama tetapi inilah beberapa perbaikan yang dapat Anda lakukan: mengubah Math.ceil(e[c].length/2)ke (r=e[c].length/2)+r%1, Array(2).fill().map((_,f)=>...)ke f=>...dan setiap e[n]ke e(n), i=+(g>h)ke i=g>hdan e[i]untuk e[+i], menghilangkan tanda kurung yang tidak perlu dalam operator ternary terakhir, Juga, newDateseharusnya new Date.
user81655
1
Hindari Math.ceilpenggunaanb=c=>e(c).length+1>>1
edc65
2

JavaScript ES6, 204

x=>(s=x=>x.split`/`,[a,b,y]=s(x).sort((a,b)=>a-b),(c=b)>12?c=a:b=a- -b>>1,s('/Janu/Febr/Mar/Apr/Ma/Ju/Ju/Aug/Septe/Octo/Nove/Dece')[a]+s('/ary/uary/ch/il/y/ne/ly/ust/mber/ber/mber/mber')[c]+` ${b}, `+y)

Cuplikan uji:

F=x=>(
  s=x=>x.split`/`,
  [a,b,y]=s(x).sort((a,b)=>a-b),
  (c=b)>12?c=a:b=a- -b>>1,
  s('/Janu/Febr/Mar/Apr/Ma/Ju/Ju/Aug/Septe/Octo/Nove/Dece')[a]
  +s('/ary/uary/ch/il/y/ne/ly/ust/mber/ber/mber/mber')[c]+` ${b}, `+y
)

console.log=x=>O.innerHTML+=x+'\n'

;['10/31/1998','25/12/1989','10/8/2011','8/5/1957','9/12/2012','1/1/2000']
.forEach(x=>console.log(x+' -> '+F(x)))
<pre id=O></pre>

edc65
sumber
2

Python 3 (290 byte)

Mirip dengan jawaban Ashwin Gupta, tetapi memanfaatkan modul kalender Python untuk menghindari menuliskan semua nama bulan.

import calendar as C
M,I,P,S,L,A=C.month_name,int,print," ",len,", "
def d(i):
 w=i.split("/")
 f,s,y=I(w[0]),I(w[1]),w[2]
 if(f>12):P(M[s]+S+w[0]+A+y)
 elif(s>12):P(M[f]+S+w[1]+A+y)
 else:l,h=min(f,s),max(f,s);P(M[l][:I(L(M[l])/2+.5)]+M[h][I(L(M[h])/2+.5):]+S+str(I((f+s)/2))+A+y)

Python 2 harus memotong beberapa byte dengan pembagian integer dan kehilangan tanda kurung print.

Jack Brounstein
sumber
1

Python, 558 554 byte

Contoh golf yang sangat, sangat, sangat mengerikan tentang cara melakukan ini dengan python. Maaf, saya sangat buruk dalam hal golf ini D:. Tapi itu berhasil. Saya yakin ada banyak cara untuk menyederhanakan ini jadi beri tahu saya di komentar. Golf:

import math
def d(i):
 l=["","January","February","March","April","May","June","July","August","September","October","November","December"]
 w=i.split('/')
 f=int(w[0])
 s=int(w[1])
 S=" "
 y=w[2]
 if(f>12):
  e=int(w[1])
  print(l[e]+S+w[0]+", "+y)
  elif(f<=12 and s>12):
   e=int(w[0])
   print(l[e]+S+w[0]+", "+y)
   else:
    if(f<s):
     o=l[f]
     t=l[s]
    else:
     o=l[s]
     t=l[f]
    o=o[0:int(math.ceil(len(o)/2))]
    t=t[int(math.ceil(len(t)/2)):len(t)]
    print(o+t+S +  str(math.floor((f + s)/2)) + ", " + y)

Tidak disatukan

import math
def d(i):
    l = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
    w = i.split('/')
    f = int(w[0])
    s = int(w[1])
    y = w[2]
    if(f > 12):
        e = int(w[1])
        print(l[e] + " " + w[0] + ", " + y)

    elif(f <= 12 and s > 12):
         e = int(w[0])
         print(l[e] + " " + w[0] + ", " + y)
    else:
         if(f < s):
            o=l[f]
            t=l[s]
         else:
            o=l[s]
            t=l[f]
         o = o[0:int(math.ceil(len(o)/2))]
         t = t[int(math.ceil(len(t)/2)):len(t)]
         print(o+t+" " +  str(math.floor((f + s)/2)) + ", " + y)

Tangkapan layar: masukkan deskripsi gambar di sini

Ashwin Gupta
sumber
letakkan S=" "di atas, lalu ganti setiap instance " "dengan S- yang akan mencukur beberapa byte
cat
ada beberapa ruang yang tidak perlu setelah penugasan ( e= int[..., o = o...). juga, itu mungkin terbukti berani untuk mengatur panggilan yang sering digunakan seperti intuntuk huruf tunggal vars
cat
1
Berikut 447 byte:from math import* I=int S=" " C="," L=len P=print def d(i): l=["","January","February","March","April","May","June","July","August","September","October","November","December"];w=i.split('/');f=I(w[0]);s=I(w[1]);y=w[2] if f>12:e=I(w[1]);P(l[e]+S+w[0]+C+S+y) elif f<13and s>12:e=I(w[0]);P(l[e]+S+w[0]+C+S+y) else: if f<s:o=l[f];t=l[s] else:o=l[s];t=l[f];o=o[0:I(ceil(L(o)/2))];t=t[I(ceil(L(t)/2)):L(t)] P(o+t+S+str(floor((f+s)/2))+C+S+y)
cat
1
@sysreq ok pikiran saya secara resmi meledak. Saya tidak tahu Anda bisa menyimpan fungsi ke variabel. Terima kasih. Saya akan mengeditnya juga. Bisakah Anda membantu saya dan mencoba menjalankan kode saya (golf) dan melihat apakah itu berfungsi seperti seharusnya karena Luke tampaknya mendapatkan hasil yang berbeda dari saya jadi saya hanya ingin melihatnya.
Ashwin Gupta
1
@sysreq ya idk. Kenapa itu berbeda baginya. Ngomong-ngomong, terima kasih lagi untuk tipsnya, ini sangat membantu tidak hanya untuk bermain golf tetapi secara umum karena saya masih baru di Python. Juga, saya baru sadar saya bisa menghapus tugas awal saya dari o dan t dan menyimpan 4 byte dengan meletakkan elemen array langsung di splitter saya. Saya akan melakukan semua perubahan ini sore ini. Berkat Anda jumlah byte baru akan jauh lebih sedikit!
Ashwin Gupta
0

PHP, 301 294 byte

function r($t){$e='return date("F",mktime(0,0,0,$o));';list($a,$b,$c)=explode('/',$t);$o=min($a,$b);$m=eval($e);$o=max($a,$b);$n=eval($e);echo(($a|$b)<13)?substr($m,0,ceil(strlen($m)/2)).substr($n,ceil(strlen($n)/2))." ".floor(($a+$b)/2).", $c":date("F j, Y",strtotime(($a>12)?"$b/$a/$c":$t));}

Saya pikir saya bisa bersaing dengan jawaban Javascript. Baiklah.

Saya pikir saya bisa membuatnya lebih kecil dan saya tidak suka kode yang saya gunakan untuk tanggal yang ambigu. Saya pikir ada cara yang lebih baik untuk melakukannya.

Tidak Disatukan:

function r($t){
    // Eval'd code to reduce char count
    $e='return date("F",mktime(0,0,0,$o));';

    // Split the date
    list($a,$b,$c)=explode('/',$t);

    // Get the earliest month
    $o=min($a,$b);
    $m=eval($e);

    // Get the latest month
    $o=max($a,$b);
    $n=eval($e);

    // If ambiguous
    if ($a<13 && $b<13) {
        print substr($m,0,ceil(strlen($m)/2)).substr($n,ceil(strlen($n)/2))." ".floor(($a+$b)/2).", $c";
    }
    else {
        print date("F j, Y",strtotime(($a>12)?"$b/$a/$c":$t));
    }
}
Kodos Johnson
sumber