¿La fecha es alfabética?

8

Escriba una función o programa que acepte una fecha (como una cadena en YYYY-MM-DDformato) como entrada y devuelva un valor verdadero si esa fecha es "alfabética" y un valor falsey si no lo es.

Una fecha alfabética es una fecha cuyo mes, día y año están en orden alfabético cuando se expresa como una cadena (y cuando se considera específicamente en orden M - D - Y). Por ejemplo, el 26 de septiembre de 2018 es una fecha alfabética:

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

September
Twenty-sixth
Two thousand eighteen

Otra forma de pensar en este desafío: "¿los elementos de una fecha dada están ordenados léxicamente?"

Notas:

  • 2018 se representa como "dos mil dieciocho", no "veinte dieciocho" o "dos cero uno ocho". Para otro ejemplo, el año 1456 se representaría como "mil cuatrocientos cincuenta y seis", no "catorce cincuenta y seis".
  • 26 se representa como "vigésimo sexto", no "veintiséis".
  • Cada elemento de la fecha se considera como un todo. Es por eso que 2018 no falla automáticamente a pesar de que la "e" en dieciocho viene antes que la "t" en dos.

Las siguientes fechas no son alfabéticas:

  • 2 de septiembre de 2018 ("segundo" debe clasificarse antes de "septiembre")
  • 30 de abril de 4000 ("cuatro mil" deberían clasificarse antes del "trigésimo")

Reglas Adicionales:

  • Recibirá la fecha como una cadena, formateada como YYYY-MM-DD. El año siempre tendrá cuatro dígitos, y el mes y el día siempre tendrán dos dígitos cada uno. El relleno cero no se representa en la conversión de cadena (por ejemplo, '2000-01-01' es 'Primero dos mil de enero' como era de esperar).
  • Puede suponer que las fechas siempre serán válidas (no el 30 de febrero, no el 1 de marzo) y que el valor del año será positivo (sin fechas BC), pero la fecha puede estar muy lejos en el futuro ("en el año dos nueve mil...").
  • Debe devolver un valor verdadero o falso, no necesariamente un valor booleano Trueo False. Si hace esto en Javascript y desea regresar '0'y 0eso está bien. Por supuesto, si desea devolver un valor booleano, siéntase libre.
  • Las lagunas estándar están prohibidas.
  • Esto es code-golf

Más ejemplos de fechas alfabéticas

  • 2066-01-02 (2 de enero de dos mil sesenta y seis)
  • 1000-04-08 (ocho de abril de mil)
  • 6000-08-01 (primero de agosto, seis mil)

Más ejemplos de fechas no alfabéticas

  • 1066-01-02 (2 de enero de mil sesenta y seis)
  • 1000-04-07 (7 de abril de mil)
  • 8000-08-01 (primero de agosto, ocho mil)
souldeux
fuente
2
El mal tiempo de Smarch .
AdmBorkBork
@Arnauld Um, ¿no? Parece que 2018-09-02 es falso, mientras que 2018-09-26 es verdadero (cuando se da como en la pregunta).
Erik the Outgolfer
@EriktheOutgolfer Derecha. Leí totalmente el desafío. (Tal vez debería reformularse como ¿Está la fecha ordenada léxicamente? O algo así).
Arnauld
@Arnauld Modifiqué el primer párrafo e incluí una línea con su redacción sugerida un poco más adelante, con suerte para el deleite de los futuros lectores. ¡Gracias!
souldeux
1
El año es siempre el número enunciado. 1444 es mil cuatrocientos cuarenta y cuatro. 1991 es mil novecientos noventa y uno.
souldeux

Respuestas:

1

05AB1E , 66 62 58 bytes

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

Pruébelo en línea o verifique todos los ejemplos mencionados en el desafío .

Explicación:

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)               

Vea esta sugerencia mía 05AB1E (sección ¿Cómo comprimir listas enteras? ) Para comprender por qué •88ΛηΣλšëÇñ0é≠>sîä&ζp°Lć®-αÅ®`•21вes [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]y ŽqT32вes [12,31,9].

Explicación general adicional:

La función de clasificación clasificará los tres tipos (día, mes, año), al mismo tiempo, donde vamos a devolver un valor Truthy sólo si M < D < Y(cuando éstas D, My Yson los valores que hemos recuperado de las listas de comprimidos).

¿Por qué estas tres listas mencionadas anteriormente? Si ponemos todas las palabras en orden, clasificadas por tipo, tenemos el siguiente orden:

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

Si luego observamos cada tipo individualmente y su orden original (mil, dos mil, etc. por años; enero, febrero, etc. por meses; y primero, segundo, etc. por días), los números de clasificación mencionados anteriormente son en estos pedidos:

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
fuente
9

JavaScript (ES6), 101 bytes

Guardado 4 bytes gracias a @Shaggy

01

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

Pruébalo en línea! o prueba todas las fechas! (incluye algunas entradas inválidas)

¿Cómo?

[0..10]MDYM<DD<Y

La última parte de la cadena de búsqueda para los ID de día está ligeramente comprimido mediante el uso ${6e12-12}, que se expande a 5999999999988(19 º a 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
fuente
104 bytes
Shaggy
@ Shaggy Oops ... Esto m=fue, por supuesto, completamente inútil. Gracias. :)
Arnauld
1
¡Eso fue rápido! Bien hecho. La "prueba de todas las fechas" y la tabla ilustrativa son especialmente apreciadas.
souldeux