Là ngày theo thứ tự abc?


8

Viết hàm hoặc chương trình chấp nhận một ngày (dưới dạng chuỗi có YYYY-MM-DDđịnh dạng) làm đầu vào và trả về giá trị trung thực nếu ngày đó là "theo thứ tự chữ cái" và giá trị falsey nếu không.

Ngày theo thứ tự chữ cái là ngày có tháng, ngày và năm theo thứ tự bảng chữ cái khi được biểu thị dưới dạng chuỗi (và khi được xem xét cụ thể theo thứ tự M - D - Y). Ví dụ: ngày 26 tháng 9 năm 2018 là một ngày theo thứ tự chữ cái:

September 26th 2018 -> September twenty-sixth two thousand eighteen

September
Twenty-sixth
Two thousand eighteen

Một cách khác để nghĩ về thách thức này: "các yếu tố của một ngày nhất định được sắp xếp theo từ vựng?"

Ghi chú:

  • Năm 2018 được thể hiện là "hai nghìn mười tám", chứ không phải "hai mươi mười tám" hay "hai không một một tám". Một ví dụ khác, năm 1456 sẽ được đại diện là "một nghìn bốn trăm năm mươi sáu", chứ không phải "mười bốn năm mươi sáu".
  • Thứ 26 được thể hiện là "hai mươi sáu", chứ không phải "hai mươi sáu".
  • Mỗi yếu tố của ngày được coi là một tổng thể. Đây là lý do tại sao năm 2018 không tự động thất bại mặc dù "e" trong mười tám đến trước "t" trong hai.

Những ngày sau đây không theo thứ tự abc:

  • Ngày 2 tháng 9 năm 2018 ("thứ hai" nên sắp xếp trước "tháng 9")
  • Ngày 30 tháng 4 năm 4000 ("bốn ngàn" nên sắp xếp trước "thứ ba mươi")

Quy tắc bổ sung:

  • Bạn sẽ nhận được ngày dưới dạng một chuỗi, được định dạng như thế nào YYYY-MM-DD. Năm sẽ luôn có bốn chữ số, và tháng và ngày sẽ luôn có hai chữ số. Không đệm không được thể hiện trong chuyển đổi chuỗi (ví dụ: '2000-01-01' là 'hai nghìn đầu tiên' như bạn mong đợi).
  • Bạn có thể cho rằng ngày sẽ luôn có hiệu lực (không có ngày 30 tháng 2, không có ngày 1 Smarch) và giá trị của năm sẽ là dương (không có ngày BC), nhưng ngày có thể sẽ ở xa trong tương lai ("trong năm hai chín ngàn ... ").
  • Bạn nên trả về một giá trị trung thực hoặc falsey, không nhất thiết phải là boolean Truehoặc False. Nếu bạn làm điều này trong Javascript và muốn quay lại '0'0điều đó tốt. Tất nhiên, nếu bạn muốn trả lại một boolean, hãy thoải mái.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là code-golf

Thêm ví dụ về ngày tháng theo thứ tự chữ cái

  • 2066-01 / 02 (Thứ hai, hai nghìn sáu mươi sáu)
  • 1000-04-08 (ngày 8 tháng 4, một nghìn)
  • 6000-08-01 (đầu tháng tám, sáu ngàn)

Thêm ví dụ về các ngày không theo thứ tự chữ cái

  • 1066-01 / 02 (giây thứ hai, một nghìn sáu mươi sáu)
  • 1000-04-07 (ngày 7 tháng Tư, một ngàn)
  • 8000-08-01 (đầu tháng 8, tám nghìn)


@Arnauld Ừm, không? Có vẻ như 2018-09-02 là sai lệch, trong khi 2018-09-26 là sự thật (khi được đưa ra như trong câu hỏi).
Erik the Outgolfer

@EriktheOutgolfer Phải. Tôi hoàn toàn đọc sai thử thách. (Có lẽ nó nên được ghi lại là Ngày được sắp xếp theo từ vựng? Hoặc một cái gì đó tương tự.)
Arnauld

@Arnauld Tôi đã điều chỉnh đoạn đầu tiên và bao gồm một dòng với từ ngữ gợi ý của bạn thêm một chút nữa, hy vọng sẽ làm hài lòng những độc giả tương lai. Cảm ơn bạn!
souldeux

1
Năm luôn luôn là con số chính tả. 1444 là một nghìn bốn trăm bốn mươi bốn. Năm 1991 là một ngàn chín trăm chín mươi mốt.
souldeux

Câu trả lời:


1

05AB1E , 66 62 58 byte

0ì'-¡ÀDΣ2£<•88ΛηΣλšëÇñ0é≠>sîä&ζp°Lć®-αÅ®`•21вŽqT32в£Nèsè}Q

Hãy thử trực tuyến hoặc xác minh tất cả các ví dụ được đề cập trong thử thách .

Giải trình:

0ì         # Prepend a "0" before the (implicit) input
           #  i.e. "2018-09-26" → "02018-09-26"
  '-¡     '# Then split on "-"
           #  i.e. "02018-09-26" → ["02018","09","26"]
     À     # Rotate it once to the left (so [0yyyy,MM,dd] becomes [MM,dd,0yyyy])
           #  i.e. ["02018","09","26"] → ["09","26","02018"]
D          # Duplicate this list
 Σ         # Sort this list by:
  2£       #  Leave only the first 2 digits of the current item
           #  (which is why the prepended 0 was there at the start for the year)
           #   i.e. "09" → "09"
           #   i.e. "02018" → "02"
    <      #  Decrease it by 1 to make it 0-indexed
           #   i.e. "09" → 8
  88ΛηΣλšëÇñ0é≠>sîä&ζp°Lć®-αÅ®`•21в
           #  Push the list [7,3,7,0,7,7,7,0,13,10,10,0,4,12,17,6,4,17,15,2,9,17,2,19,17,6,4,17,15,2,9,19,19,19,19,19,19,19,19,19,19,17,17,11,20,18,5,5,16,14,1,8]
   ŽqT32в  #  Push the list [12,31,9]
         £ #  Split the first list into parts of that size: [[7,3,7,0,7,7,7,0,13,10,10,0],
           #    [4,12,17,6,4,17,15,2,9,17,2,19,17,6,4,17,15,2,9,19,19,19,19,19,19,19,19,19,19,17,17],
           #    [11,20,18,5,5,16,14,1,8]]
   Nè      #  Then only leave the relevant list of the three based on the sort-index
     s     #  Swap to get the earlier integer at the top of the stack again
      è    #  And use it to index into the list
           #   i.e. [7,3,7,0,7,7,7,0,13,10,10,0] and 8 → 13
 }         # Close the sort
  Q        # And check if the sorted list is equal to the duplicated list,
           # so whether the order is still [MM,dd,0yyyy] after sorting
           # (and output the result implicitly)               

Xem 05AB1E mẹo này của tôi (phần như thế nào vào danh sách số nguyên nén? ) Để hiểu tại sao •88ΛηΣλšëÇñ0é≠>sîä&ζp°Lć®-αÅ®`•21в[7,3,7,0,7,7,7,0,13,10,10,0,4,12,17,6,4,17,15,2,9,17,2,19,17,6,4,17,15,2,9,19,19,19,19,19,19,19,19,19,19,17,17,11,20,18,5,5,16,14,1,8]ŽqT32в[12,31,9].

Giải thích chung:

Các chức năng sắp xếp sẽ sắp xếp tất cả ba loại (ngày, tháng, năm) cùng một lúc, nơi chúng tôi sẽ trả về một giá trị truthy chỉ nếu M < D < Y(nơi những D, MYlà những giá trị chúng tôi đã lấy ra từ danh sách nén).

Tại sao ba danh sách nêu trên? Nếu chúng tôi đặt tất cả các từ theo thứ tự, được phân loại theo loại, chúng tôi có thứ tự sau:

Sorting nr      Type        Which?

0               Month       April, August, December
1               Year        eight thousand
2               Day         eighteenth, eighth, eleventh
3               Month       February
4               Day         fifteenth, fifth, first
5               Year        five thousand, four thousand
6               Day         fourteenth, fourth
7               Month       January, July, June, March, May
8               Year        nine thousand
9               Day         ninteenth, ninth
10              Month       November, October
11              Year        one thousand
12              Day         second
13              Month       September
14              Year        seven thousand
15              Day         seventeenth, seventh
16              Year        six thousand
17              Day         sixteenth, sixth, tenth, third, thirteenth, thirtieth, thirty-first
18              Year        three thousand
19              Day         twelfth, twentieth, twenty-first through twenty-ninth
20              Year        two thousand

Sau đó, nếu chúng ta xem xét từng loại riêng lẻ và thứ tự ban đầu của chúng (một nghìn, hai nghìn, v.v. trong nhiều năm; tháng 1, tháng 2, v.v. trong nhiều tháng và thứ nhất, thứ hai, v.v. trong nhiều ngày), các số sắp xếp được đề cập ở trên là trong các đơn đặt hàng:

Years:  [11,20,18,5,5,16,14,1,8]
Months: [7,3,7,0,7,7,7,0,13,10,10,0]
Days:   [4,12,17,6,4,17,15,2,9,17,2,19,17,6,4,17,15,2,9,19,19,19,19,19,19,19,19,19,19,17,17]

9

JavaScript (ES6), 101 byte

Đã lưu 4 byte nhờ @Shaggy

01

s=>'_414044406550'[[,m,d]=s.split`-`,+m]<(d=`_268328715819832871${6e12-12}`[+d])&d<'_6A9338704'[s[0]]

Hãy thử trực tuyến! hoặc Kiểm tra tất cả các ngày! (bao gồm một số đầu vào không hợp lệ)

Làm sao?

[0..10]MDYM<DD<Y

Phần cuối cùng của chuỗi tra cứu cho các ID ngày là hơi nén bằng cách sử dụng ${6e12-12}, trong đó mở rộng tới 5999999999988(19 tháng đến 31 st ).

  M | Month                D | Day                  Y | Year (millennium)
----+----------------    ----+----------------    ----+-------------------
  0 | April                1 | eighth               0 | eight thousand
  0 | August               1 | eleventh           ----+-------------------
  0 | December             1 | eighteenth           3 | four thousand
----+----------------    ----+----------------      3 | five thousand
  1 | February             2 | first              ----+-------------------
----+----------------      2 | fifth                4 | nine thousand
  4 | January              2 | fifteenth          ----+-------------------
  4 | March              ----+----------------      6 | one thousand
  4 | May                  3 | fourth             ----+-------------------
  4 | June                 3 | fourteenth           7 | seven thousand
  4 | July               ----+----------------    ----+-------------------
----+----------------      5 | ninth                8 | six thousand
  5 | October              5 | nineteenth         ----+-------------------
  5 | November           ----+----------------      9 | three thousand
----+----------------      6 | second             ----+-------------------
  6 | September          ----+----------------     10 | two thousand
                           7 | seventh
                           7 | seventeenth
                         ----+----------------
                           8 | third
                           8 | sixth
                           8 | tenth
                           8 | thirteenth
                           8 | sixteenth
                           8 | thirtieth
                           8 | thirty-first
                         ----+----------------
                           9 | twelfth
                           9 | twentieth
                           9 | twenty-*


@ Shaggy Oops ... m=Tất nhiên, điều này hoàn toàn vô dụng. Cảm ơn. :)
Arnauld

1
Nó thật nhanh! Làm rất tốt "Kiểm tra tất cả các ngày" và bảng minh họa được đặc biệt đánh giá cao.
souldeux
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.