Định dạng ngày này là gì?


11

Đối với lịch Gregorian, định dạng ngày thay đổi từ quốc gia này sang quốc gia khác. Có ba định dạng chính được công nhận:

  1. YY-MM-DD (đại gia)
  2. DD-MM-YY (người cuối cùng)
  3. MM-DD-YY (trung niên)

Nhiệm vụ của bạn là viết một chương trình, đưa ra một chuỗi đầu vào đại diện cho một ngày, xuất ra tất cả các định dạng ngày có thể mà chuỗi này có thể được hiểu là một ngày.

Quy tắc

  • Ngày đầu vào có định dạng xx-xx-xx, trong đó mỗi trường có hai chữ số và không có đệm.
  • Ngày luôn hợp lệ (vì vậy bạn không thể có được những thứ như 14-13-17)
  • Ngày luôn có ít nhất một trong các định dạng ở trên (vì vậy bạn không thể có được những thứ như 17-14-11)
  • Bởi vì thực tế chúng ta đang ở trong một thế giới song song, có 31 ngày cho mỗi tháng trong năm và do đó không có năm nhuận
  • Ngày từ ngày 1 tháng 1 năm 2001 đến ngày 31 tháng 12 năm 2099
  • Nếu chỉ có một định dạng cho ngày, mã phải chỉ in nó (chỉ cho phép các dòng mới theo dõi)
  • Nếu có một vài định dạng cho ngày, chúng phải được phân tách bằng dấu phẩy, dấu cách, dòng mới hoặc kết hợp cả hai định dạng
  • Bạn phải xuất tên chính xác của định dạng. Sử dụng các giá trị tùy ý riêng biệt không được phép.
  • Không cho phép các ký tự đầu hoặc cuối khác ngoài khoảng trắng ở cuối
  • Đầu ra phải là chữ thường
  • Bạn không được phép sử dụng bất kỳ chức năng ngày hoặc lịch tích hợp nào
  • Các định dạng đầu ra không phải được sắp xếp

Ví dụ

Input      Output
30-05-17   big-endian, little-endian
05-15-11   middle-endian
99-01-02   big-endian
12-11-31   big-endian, little-endian, middle-endian
02-31-33   middle-endian

Đây là vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Giải thích được khuyến khích.


3
Bạn có thể nên thêm một trường hợp thử nghiệm vào ngày 31 tháng 2 để đảm bảo câu trả lời hỗ trợ cho trường hợp kỳ lạ đó: P
Sản phẩm ETH

Chúng ta có thể xuất bất kỳ ba giá trị riêng biệt nào cho ba định dạng hợp lệ hay phải là ba chuỗi chính xác đó?
Sản phẩm ETH

3
there are 31 days for every month of the year, and consequently no leap yearsVì vậy, điều này có nghĩa là bất kỳ thư viện ngày là vô dụng cho việc này sau đó?
TheLethalCoder

1
@TheLethalCoder Có, hầu hết các thư viện ngày có thể không sử dụng được.
Jim

Câu trả lời:


3

05AB1E , 40 byte

'-¡©2£13‹`®Á2£32‹*)˜“Œ±„¥„ê“#Ï’-„–ian’«»

Hãy thử trực tuyến!

Giải trình

'-¡©                                      # split on "-" and store a copy in register
    2£13‹                                 # compare the first 2 elements to 13
         `                                # split as separate to stack
                                          # the bottom element is true if it is middle endian
                                          # the top value is true if it can be big/little
          ®Á                              # retrieve the list from register and rotate right
            2£32‹                         # compare the first 2 elements to 32
                 *                        # multiply with the result of the comparison to 13
                  )˜                      # wrap in a flattened list
                    “Œ±„¥„ê“#             # push the list ['middle', 'big', 'little']
                             Ï            # index into this with the flattened list
                                          # this leaves the types the date could be
                              ’-„–ian’«   # append "-endian" to each
                                       »  # join on newlines

4

Python 2 , 123 byte

a,b,c=map(int,input().split('-'))
for a,b,c in[[b,c,'big'],[b,a,'little'],[a,b,'middle']]:print(c+'-endian')*(a<13)*(b<32),

Hãy thử trực tuyến!


Python 2 , phân tích cú pháp đầu vào ít hơn, 123 byte

d=input()
for a,b,c in[[3,6,'big'],[3,0,'little'],[0,3,'middle']]:print(c+'-endian')*(int(d[a:a+2])<13)*(int(d[b:b+2])<32),

Hãy thử trực tuyến!


Bạn được phép tách riêng với dòng mới, vì vậy có thể xóa dấu vết ,.
Jonathan Allan

4

JavaScript (ES6), 121 119 118 112 byte

Trả về một chuỗi được phân tách bằng dấu cách với một khoảng trắng ở cuối.

s=>['big','little','middle'].map((v,i)=>[b<13&c<32,b<13&a<32,a<13][i]?v+'-endian ':'',[a,b,c]=s.split`-`).join``

Làm sao?

Chúng tôi chia đầu vào thành a , bc . Vì ngày được đảm bảo là hợp lệ, chúng tôi biết chắc chắn rằng b nhỏ hơn 32. Do đó, đủ để kiểm tra xem a có nhỏ hơn 13 để xác thực định dạng giữa cuối hay không. Các định dạng Little endian và big endian yêu cầu b phải nhỏ hơn 13 và một thử nghiệm khác trên ac tương ứng để xác nhận ngày.

Do đó, 3 bài kiểm tra:

  • Đại gia: b <13 & c <32
  • Little endian: b <13 & a <32
  • Trung cuối: a <13

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


3

Bash, 240 125 116 112 byte

IFS=- read a b c<<<$1
d=-endian
((b<13))&&(((a<32))&&echo little$d;((c<32))&&echo big$d);((a<13))&&echo middle$d

Chơi gôn.

Cảm ơn manatwork cho một số lời khuyên

Đã lưu 9 byte loại bỏ xác minh ít hơn 32 trong câu trả lời Arnauld của người trung gian

Đã lưu 4 byte bằng cách sử dụng các biến khác nhau thay vì một mảng

Kiểm tra nó!



Cảm ơn bạn @manatwork Tôi có câu hỏi được đánh dấu là rất hữu ích, sẽ đánh golf bằng nó
DrnglVrss

1

C #, 180 byte

t=(n,m)=>int.Parse(n)<13&int.Parse(m)<32;s=>{var a=s.Split('-');return$"{(t(a[1],a[2])?"big-endian":"")} {(t(a[1],a[0])?"little-endian":"")} {(t(a[0],a[1])?"middle-endian":"")}";};

Các đầu ra chỉ có các giá trị được phân tách bằng dấu cách, cũng có thể có các khoảng trắng ở đầu và cuối. Sẽ cập nhật khi OP đã làm rõ về điểm đó nếu cần.

Phiên bản đầy đủ / được định dạng:

Func<string, string, bool> t = (n, m) => int.Parse(n) < 13 & int.Parse(m) < 32;

Func<string, string> f = s =>
{
    var a = s.Split('-');

    return $"{(t(a[1], a[2]) ? "big-endian" : "")} {(t(a[1], a[0]) ? "little-endian" : "")} {(t(a[0], a[1]) ? "middle-endian" : "")}";
};

Tôi đã làm cho quy tắc rõ ràng hơn:No leading or trailing characters others than a trailing space are allowed
Jim

1

PHP, 151 byte

[$a,$b,$c]=sscanf($argn,"%d-%d-%d");$z="-endian ";echo($m=$b&&$b<13)&&$c&&$c<32?big.$z:"",$m&&$a&&$a<32?little.$z:"",$a&&$a<13&&$b&&$b<32?middle.$z:"";

Tủ thử


1

Mẻ, 138 byte

@echo off
set/ps=
call:l little %s:-= %
exit/b
:l
call:e big %4 %3
call:e middle %3 %2
:e
if %2 leq 31 if %3 leq 12 echo %1-endian

Mơ hồ dựa trên câu trả lời của @ ovs.


1

Java 232 byte

(String s)=>{String[]i=s.split("-");String e="-endian",b="big"+e,m="middle"+e,l="little"+e;int p=Integer.valueOf(i[0]);System.out.print(p<13?Integer.valueOf(i[1])<13?Integer.valueOf(i[2])<32?b+","+m+","+l:m+","+l:m:p<32?b+","+l:b);}

Đây là một phiên bản đẹp hơn

String[] i = s.split("-");

String e = "-endian",
       b = "big" + e,
       m = "middle" + e,
       l = "little" + e;

int p = Integer.valueOf(i[0]);

Tôi thực sự không biết làm thế nào để định dạng phần này ...

System.out.print(
        p < 13 ? Integer.valueOf(I[1]) < 13 ? Integer.valueOf(I[2]) < 32 ? b + "," + m + "," + l
                                                                         : m + "," + l
                                            : m 

               : p < 32 ? b + "," + l 
                        : b
);

1
Quá nhiều người ủng hộ : String e="-endian",b="big"+e,m="middle"+e,l="little"+e;.
thao tác

Điểm hay, khi tôi quyết định không làm điều đó, tôi đã thêm một "Chuỗi" vào số byte của mình. @manatwork
cheemcheem

1

PHP, 131 byte

[$a,$b,$c]=explode('-',$argn);foreach([[big,b,c],[little,b,a],[middle,a,b]]as[$t,$x,$y])echo$$x*$$y&&$$x<13&$$y<32?"$t-endian ":"";
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.