Giải quyết tranh chấp định dạng ngày


17

Thứ tự định dạng của ngày là một trong những vấn đề phức tạp và gây chia rẽ nhất mà thế giới phải đối mặt ngày nay. Một số người trong chúng tôi tranh luận kịch liệt rằng Tháng / Ngày / Năm là phù hợp, xem xét đó là cách chúng tôi nói ngày thành tiếng. Những người khác lớn tiếng tuyên bố rằng Ngày / Tháng / Năm là tốt nhất, bởi vì nó đặt các điều khoản theo thứ tự tăng dần của thời lượng mà họ đại diện.

Đủ là đủ. Máy tính có thể giải quyết tranh chấp này một cách đơn giản và công bằng. Mã của bạn, một chức năng hoặc chương trình hoàn chỉnh, sẽ lấy một chuỗi ngày được phân tách bằng dấu gạch chéo, vd 12/1/2015. Lưu ý đây là định dạng chính xác, không có số 0 đứng đầu và có một năm có bốn chữ số ở cuối.

  • Nếu đó chắc chắn là Tháng / Ngày / Năm, ví dụ: 10/31/1998xuất ra một văn bản đại diện cho ngày đó theo định dạng chính xác này, với tên đầy đủ của tháng, ngày và năm:October 31, 1998
  • Nếu đó chắc chắn là Ngày / Tháng / Năm, ví dụ: 25/12/1989xuất ra loại đại diện văn bản tương tự : December 25, 1989.
  • Nếu nó mơ hồ cho dù đó là Tháng / Ngày / Năm hay Ngày / Tháng / Năm, hãy đưa ra một ngày giải quyết sự mơ hồ bằng cách kết hợp hai ngày có thể như sau:
    1. Tạo một tên tháng mới bằng cách lấy một nửa đầu tiên của tên của đầu tháng và thêm nửa sau của sau tháng. Đối với các tháng có độ dài lẻ, nửa đầu nhận được thêm chữ cái. Để được rõ ràng, các nửa đầu tiên của tháng là Janu, Febr, Mar, Apr, Ma, Ju, Ju, Aug, Septe, Octo, Nove, và Decevà do đó nửa thứ hai là ary, uary, ch, il, y, ne, ly, ust, mber, ber, mber, và mber.
    2. Tính ngày bằng cách tính trung bình hai ngày có thể, lấy sàn khi trung bình không phải là số nguyên.
    3. Xuất ra văn bản đại diện của ngày này, ví dụ 10/8/2011, cho đầu ra Augber 9, 2011.

Nếu ngày đầu vào không thể là Tháng / Ngày / Năm hoặc Ngày / Tháng / Năm (ví dụ 13/13/2013hoặc thậm chí 2/30/2002), mọi hành vi đều được chấp nhận. Mã golf này, mã ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm:

10/31/1998 cho October 31, 1998

25/12/1989 cho December 25, 1989

10/8/2011 cho Augber 9, 2011

8/5/1957 cho Maust 6, 1957

9/12/2012 (đủ kỳ lạ) cho September 10, 2012

1/1/2000 cho January 1, 2000



20
Đối với những gì nó có giá trị, rất nhiều người tranh luận cho ngày tháng năm cũng nói ngày theo thứ tự đó. (Tất nhiên, các lập trình viên thực sự tranh luận cho năm-tháng-ngày).
Peter Taylor

Chỉ cần chắc chắn: without leading zeroes and with a four-digit year at the endngụ ýyear >= 1000
edc65

Đúng rồi.
Lu-ca

1
+ Cho ngày 10 tháng 9 năm 2012
ev3commander

Câu trả lời:


1

Pyth - 156 byte

Mã thực sự xấu, và sẽ cần phải sử dụng các chuỗi đóng gói, nhưng cái gì đó của nó.

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

Phòng thử nghiệm .


3

Toán học 341 304 298 288 293 byte

Điều này sử dụng một hàm thuần túy hoặc ẩn danh, nghĩa là một hàm không có tên riêng của nó.

DateStringtrả về một thông báo lỗi nếu ngày không rõ ràng Checknắm bắt sự mơ hồ và gửi ngày vi phạm đến DateList, biến nó thành danh sách 3 số nguyên (mà nó tin là như vậy {year, month, day}). Số nguyên tháng và ngày được sắp xếp theo kích thước và được sử dụng để xác định tháng và ngày theo hướng dẫn của OP.

Quiet in lỗi im lặng.

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 tháng 10 năm 1998", "25 tháng 12 năm 1989", "Augber 9, 2011", "Maust 6, 1957", "10 tháng 9 năm 2012", "1 tháng 1 năm 2012"}


Cá nhân tôi rất thích thấy bạn loại bỏ 0 đó, nhưng tôi sẽ để số phiếu giảm xuống có thể.
Lu-ca

Bây giờ nó trả về "ngày 1 tháng 1 năm 2012" theo yêu cầu.
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])

Chỉnh sửa: Sử dụng toLocaleStringđể tạo tên tháng. Thay đổi ngôn ngữ để nhận kết quả bằng cách sử dụng tên tháng ở các địa phương khác nhau!

Chỉnh sửa 2: Bây giờ tạo tên hai tháng thay vì tất cả 12!

Ung dung:

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]
)

Thí dụ:

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')
);

Cảm ơn:
@ user81655 , 274 => 246 byte
@ edc65 , 246 => 238 byte


1
Tôi đã không nhìn rất kỹ lưỡng nhưng đây là một vài cải tiến, bạn có thể thực hiện: thay đổi Math.ceil(e[c].length/2)để (r=e[c].length/2)+r%1, Array(2).fill().map((_,f)=>...)đến f=>...và mỗi e[n]đến e(n), i=+(g>h)đến i=g>he[i]để e[+i], loại bỏ các dấu ngoặc không cần thiết trong điều hành ternary ngoái, Ngoài ra, newDatenên có new Date.
dùng81655

1
Tránh Math.ceilsử dụngb=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)

Đoạn kiểm tra:

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>


2

Python 3 (290 byte)

Tương tự như câu trả lời của Ashwin Gupta, nhưng tận dụng mô-đun lịch của Python để tránh viết ra tất cả các tên tháng.

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 nên cắt bớt một vài byte với phép chia số nguyên và mất dấu ngoặc đơn cho print.


1

Python, 558 554 byte

Một ví dụ thực sự, thực sự, thực sự khủng khiếp về cách làm điều này trong python. Xin lỗi, tôi rất tệ trong việc chơi golf này D:. Nó hoạt động mặc dù. Tôi chắc chắn có nhiều cách để đơn giản hóa điều này vì vậy hãy cho tôi biết trong phần bình luận. Chơi gôn

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)

Bị đánh cắp

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)

Ảnh chụp màn hình: nhập mô tả hình ảnh ở đây


đặt S=" "ở trên cùng, sau đó thay thế mọi trường hợp " "bằng S- sẽ loại bỏ một số byte
con mèo

có một vài khoảng trống không cần thiết sau khi gán ( e= int[..., o = o...). Ngoài ra, nó có thể chứng minh sự mạo hiểm khi đặt các cuộc gọi thường được sử dụng như intvars chữ cái đơn
mèo

1
Đây là 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)
con mèo

1
@sysreq ok đầu óc tôi chính thức bị thổi bay. Tôi không biết bạn có thể lưu các hàm vào một biến. Cảm ơn bạn. Tôi sẽ chỉnh sửa nó. Ngoài ra, bạn có thể giúp tôi không và thử chạy mã của tôi (đánh gôn) và xem nó có hoạt động như vậy không vì Luke dường như nhận được kết quả khác với tôi nên tôi chỉ muốn xem.
Ashwin Gupta

1
@sysreq vâng idk. Tại sao nó khác với anh ta. Dù sao, cảm ơn một lần nữa vì những lời khuyên, nó thực sự giúp ích không chỉ cho việc chơi golf mà nói chung vì tôi vẫn chưa quen với Python. Ngoài ra, tôi chỉ nhận ra rằng tôi có thể loại bỏ các phép gán ban đầu là o và t và lưu 4 byte bằng cách đặt phần tử mảng trực tiếp vào bộ chia của tôi. Tôi sẽ thực hiện tất cả những thay đổi vào chiều nay. Nhờ có bạn, số byte mới sẽ ít hơn đáng kể!
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));}

Tôi nghĩ rằng tôi có thể cạnh tranh với câu trả lời Javascript. Ồ tốt

Tôi nghĩ rằng tôi có thể làm cho nó nhỏ hơn và tôi không thích mã tôi đã sử dụng cho những ngày mơ hồ. Tôi nghĩ rằng có một cách tốt hơn để làm điều đó.

Ung dung:

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));
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.