Apakah tanggal menurut abjad?

8

Tulis fungsi atau program yang menerima tanggal (sebagai string dalam YYYY-MM-DDformat) sebagai input dan mengembalikan nilai kebenaran jika tanggal itu "alfabet," dan nilai falsey jika bukan.

Tanggal alfabet adalah tanggal yang bulan, hari dan tahunnya dalam urutan alfabet ketika dinyatakan sebagai string (dan bila dianggap secara khusus dalam urutan M - D - Y). Misalnya, 26 September 2018 adalah tanggal alfabet:

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

September
Twenty-sixth
Two thousand eighteen

Cara lain untuk memikirkan tantangan ini: "apakah unsur-unsur dari tanggal tertentu diurutkan secara leksikal?"

Catatan:

  • 2018 direpresentasikan sebagai "dua ribu delapan belas," bukan "dua puluh delapan belas" atau "dua nol satu delapan." Sebagai contoh lain, tahun 1456 akan direpresentasikan sebagai "seribu empat ratus lima puluh enam," bukan "empat belas lima puluh enam."
  • 26 diwakili sebagai "dua puluh enam," bukan "dua puluh enam."
  • Setiap elemen tanggal dianggap sebagai keseluruhan. Inilah sebabnya mengapa 2018 tidak secara otomatis gagal meskipun "e" dalam delapan belas muncul sebelum "t" dalam dua.

Tanggal-tanggal berikut ini tidak menurut abjad:

  • 2 September 2018 ("kedua" harus lebih cepat dari "September")
  • 30 April 4000 ("empat ribu" harus mengurutkan dari "ketiga puluh")

Aturan tambahan:

  • Anda akan menerima tanggal sebagai string, berformat seperti YYYY-MM-DD. Tahun akan selalu memiliki empat digit, dan bulan dan hari akan selalu memiliki dua digit masing-masing. Padding-nol tidak terwakili dalam konversi string (mis., '2000-01-01' adalah 'Januari pertama dua ribu' seperti yang Anda harapkan).
  • Anda dapat mengasumsikan bahwa tanggal akan selalu valid (no 30 Februari, no Smarch 1) dan bahwa nilai tahun akan positif (tidak ada tanggal SM), tetapi tanggal tersebut mungkin jauh di masa depan ("pada tahun dua sembilan ribu...").
  • Anda harus mengembalikan nilai truey atau falsey, tidak harus boolean Trueatau False. Jika Anda melakukan ini dalam Javascript dan ingin kembali '0'dan 0itu bagus. Tentu saja, jika Anda ingin mengembalikan boolean, silakan saja.
  • Celah standar dilarang.
  • Ini adalah code-golf

Lebih Banyak Contoh Tanggal Alfabet

  • 2066-01-02 (Januari kedua, dua ribu enam puluh enam)
  • 1000-04-08 (delapan April, seribu)
  • 6000-08-01 (1 Agustus, enam ribu)

Lebih Banyak Contoh Tanggal Non-Alfabet

  • 1066-01-02 (Januari kedua, seribu enam puluh enam)
  • 1000-04-07 (Ketujuh April, seribu)
  • 8000-08-01 (1 Agustus, delapan ribu)
Souldeux
sumber
2
Cuaca buruk Smarch .
AdmBorkBork
@Arnauld Um, bukan? Sepertinya 2018-09-02 adalah palsu, sedangkan 2018-09-26 benar (bila diberikan seperti dalam pertanyaan).
Erik the Outgolfer
@EriktheOutgolfer Benar. Saya salah membaca tantangan. (Mungkin harus diulangi sebagai Apakah tanggal diurutkan secara leksikal? Atau sesuatu seperti itu.)
Arnauld
@Arnauld Saya mengubah paragraf pertama dan menyertakan baris dengan kata-kata yang Anda sarankan sedikit lebih jauh, semoga menyenangkan pembaca di masa depan. Terima kasih!
souldeux
1
Tahun selalu merupakan angka yang terbilang. 1444 adalah seribu empat ratus empat puluh empat. 1991 adalah seribu sembilan ratus sembilan puluh satu.
souldeux

Jawaban:

1

05AB1E , 66 62 58 byte

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

Cobalah secara online atau verifikasi semua contoh yang disebutkan dalam tantangan .

Penjelasan:

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)               

Lihat tip tambang 05AB1E ini (bagian Bagaimana cara mengompresi daftar bilangan bulat? ) Untuk memahami mengapa •88ΛηΣλšëÇñ0é≠>sîä&ζp°Lć®-αÅ®`•21вada [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]atau ŽqT32вtidak [12,31,9].

Penjelasan umum tambahan:

Fungsi semacam akan menyortir semua tiga jenis (hari, bulan, tahun) pada saat yang sama, di mana kami akan mengembalikan nilai truthy hanya jika M < D < Y(di mana ini D, Mdan Yadalah nilai-nilai yang telah kita diambil dari daftar terkompresi).

Mengapa ketiga daftar ini disebutkan di atas? Jika kami mengurutkan semua kata, dikategorikan berdasarkan jenis, kami memiliki urutan sebagai berikut:

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

Jika kita kemudian melihat masing-masing jenis secara individual dan urutan aslinya (seribu, dua ribu, dll selama bertahun-tahun; Januari, Februari, dll selama berbulan-bulan; dan pertama, kedua, dll selama berhari-hari), nomor penyortiran yang disebutkan di atas adalah dalam pesanan ini:

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]
Kevin Cruijssen
sumber
9

JavaScript (ES6), 101 byte

Disimpan 4 byte berkat @Shaggy

Mengembalikan atau .01

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

Cobalah online! atau Uji semua tanggal! (termasuk beberapa input yang tidak valid)

Bagaimana?

Setiap bulan, setiap hari dan setiap tahun dipetakan ke ID di ( masing-masing , dan ) sesuai dengan tabel berikut. Kami kemudian menguji apakah kami memiliki dan .[0..10]MDYM<DD<Y

Bagian terakhir dari string lookup untuk ID hari sedikit dikompresi dengan menggunakan ${6e12-12}, yang mengembang ke 5999999999988(19 th ke 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-*
Arnauld
sumber
104 byte
Shaggy
@Shaggy Ups ... Ini m=, tentu saja, sama sekali tidak berguna. Terima kasih. :)
Arnauld
1
Itu tadi cepat! Bagus sekali. "Uji semua tanggal" dan tabel ilustrasi sangat dihargai.
souldeux