Ist das Datum alphabetisch?

8

Schreiben Sie eine Funktion oder ein Programm, das ein Datum (als Zeichenfolge im YYYY-MM-DDFormat) als Eingabe akzeptiert und einen Wahrheitswert zurückgibt, wenn dieses Datum "alphabetisch" ist, und einen False-Wert, wenn dies nicht der Fall ist.

Ein alphabetisches Datum ist ein Datum, dessen Monat, Tag und Jahr in alphabetischer Reihenfolge angegeben sind, wenn es als Zeichenfolge ausgedrückt wird (und wenn es speziell in der Reihenfolge M - D - Y betrachtet wird). Der 26. September 2018 ist beispielsweise ein alphabetisches Datum:

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

September
Twenty-sixth
Two thousand eighteen

Eine andere Art, sich diese Herausforderung vorzustellen: "Sind die Elemente eines bestimmten Datums lexikalisch sortiert?"

Anmerkungen:

  • 2018 wird als "zweitausendachtzehn" dargestellt, nicht als "achtundzwanzig achtzehn" oder "zwei null eins acht". Für ein anderes Beispiel würde das Jahr 1456 als "eintausendvierhundertsechsundfünfzig" dargestellt, nicht als "vierzehn sechsundfünfzig".
  • 26. wird als "sechsundzwanzig" dargestellt, nicht als "sechsundzwanzig".
  • Jedes Element des Datums wird als Ganzes betrachtet. Aus diesem Grund schlägt 2018 nicht automatisch fehl, obwohl das "e" in achtzehn vor dem "t" in zwei steht.

Die folgenden Daten sind nicht alphabetisch:

  • 2. September 2018 ("zweite" sollte vor "September" sortieren)
  • 30. April 4000 ("viertausend" sollten vor "dreißigsten" sortieren)

Zusätzliche Regeln:

  • Sie erhalten das Datum als Zeichenfolge, formatiert wie YYYY-MM-DD. Das Jahr hat immer vier Ziffern und der Monat und der Tag haben immer jeweils zwei Ziffern. Das Auffüllen mit Nullen wird in der Zeichenfolgenkonvertierung nicht dargestellt (z. B. "2000-01-01" ist erwartungsgemäß "1. Januar zweitausend").
  • Sie können davon ausgehen, dass die Daten immer gültig sind (kein 30. Februar, kein Smarch 1.) und dass der Wert des Jahres positiv ist (keine Daten vor Christus), aber das Datum kann weit in der Zukunft liegen ("im Jahr zwei, neun tausend...").
  • Sie sollten einen wahrheitsgemäßen oder falschen Wert zurückgeben, nicht unbedingt einen booleschen Trueoder False. Wenn Sie dies in Javascript tun und zurückkehren wollen '0'und 0das ist in Ordnung. Wenn Sie einen Booleschen Wert zurückgeben möchten , können Sie sich natürlich frei fühlen.
  • Standardlücken sind verboten.
  • Das ist code-golf

Weitere Beispiele für alphabetische Daten

  • 2066-01-02 (2. Januar, zweitausendsechsundsechzig)
  • 1000-04-08 (8. April, eintausend)
  • 6000-08-01 (erster August, sechstausend)

Weitere Beispiele für nicht alphabetische Daten

  • 1066-01-02 (2. Januar, eintausendsechsundsechzig)
  • 1000-04-07 (7. April, eintausend)
  • 8000-08-01 (erster August, achttausend)
souldeux
quelle
2
Mieses Smarch-Wetter .
AdmBorkBork
@Arnauld Ähm, nein? Es sieht so aus, als ob der 02.09.2018 falsch ist, während der 26.09.2018 wahr ist (wenn wie in der Frage angegeben).
Erik der Outgolfer
@EriktheOutgolfer Richtig. Ich habe die Herausforderung total falsch verstanden. (Vielleicht sollte es umformuliert werden als Ist das Datum lexikalisch sortiert? Oder so ähnlich.)
Arnauld
@Arnauld Ich habe den ersten Absatz optimiert und eine Zeile mit Ihrem vorgeschlagenen Wortlaut etwas weiter eingefügt, hoffentlich zur Freude zukünftiger Leser. Vielen Dank!
Souldeux
1
Das Jahr ist immer die buchstabierte Zahl. 1444 ist eintausendvierhundertvierundvierzig. 1991 ist eintausendneunhunderteinundneunzig.
Souldeux

Antworten:

1

05AB1E , 66 62 58 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle in der Herausforderung genannten Beispiele .

Erläuterung:

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)               

Sehen Sie diese 05AB1E Spitze Mine (Abschnitt Wie Kompresse integer Listen? ) Zu verstehen , warum •88ΛηΣλšëÇñ0é≠>sîä&ζp°Lć®-αÅ®`•21вist [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]und ŽqT32вist [12,31,9].

Zusätzliche allgemeine Erklärung:

Die Sortierfunktion sortiert werden alle drei Typen (Tag, Monat, Jahr) zur gleichen Zeit, wo wir ein truthy Wert zurückgeben wird nur , wenn M < D < Y(wo diese D, Mund Ysind die Werte , die wir aus den komprimierten Listen abgerufen haben).

Warum diese drei oben genannten Listen? Wenn wir alle Wörter nach Typ kategorisieren, haben wir die folgende Reihenfolge:

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

Wenn wir dann jeden Typ einzeln und seine ursprüngliche Reihenfolge betrachten (eintausend, zweitausend usw. für Jahre; Januar, Februar usw. für Monate und erste, zweite usw. für Tage), sind die oben genannten Sortiernummern in diesen Bestellungen:

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

JavaScript (ES6), 101 Byte

4 Bytes dank @Shaggy gespeichert

Gibt oder .01

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

Probieren Sie es online aus! oder Teste alle Daten! (enthält einige ungültige Eingaben)

Wie?

Jeder Monat, jeder Tag und jedes Jahr wird gemäß der folgenden Tabelle einer ID in ( , bzw. ) zugeordnet. Wir testen dann, ob wir und .[0..10]MDYM<DD<Y

Der letzte Teil der Lookup - Zeichenfolge für Tag - IDs unter Verwendung von leicht komprimiert ${6e12-12}, was erweitert 5999999999988(19 th bis 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
quelle
104 Bytes
Shaggy
@ Shaggy Ups ... Das m=war natürlich völlig nutzlos. Vielen Dank. :)
Arnauld
1
Das war schnell! Schön gemacht. Besonders geschätzt werden der "Test all Dates" und die illustrative Tabelle.
Souldeux