Was ist dieses Datumsformat?

11

Bei Gregorianischen Kalendern variiert das Datumsformat von Land zu Land. Es werden drei Hauptformate erkannt:

  1. YY-MM-DD (Big-Endian)
  2. DD-MM-YY (Little-Endian)
  3. MM-DD-YY (Middle-Endian)

Ihre Aufgabe ist es, ein Programm zu schreiben, das bei einer Eingabezeichenfolge, die ein Datum darstellt, alle möglichen Datumsformate ausgibt, mit denen diese Zeichenfolge als Datum interpretiert werden kann.

Regeln

  • Das Eingabedatum hat das Format xx-xx-xx, in dem jedes Feld zweistellig und mit Nullen aufgefüllt ist.
  • Das Datum ist immer gültig (so dass Sie Dinge wie 14-13-17 nicht bekommen können)
  • Das Datum ist immer mindestens eines der oben genannten Formate (Sie können also keine Dinge wie 17-14-11 erhalten).
  • Da wir uns tatsächlich in einer Parallelwelt befinden, gibt es 31 Tage für jeden Monat des Jahres und folglich keine Schaltjahre
  • Das Datum liegt zwischen dem 01. Januar 2001 und dem 31. Dezember 2099
  • Wenn es nur ein Format für das Datum gibt, darf der Code nur dieses drucken (nur nachgestellte Zeilenumbrüche sind zulässig).
  • Wenn es für das Datum mehrere Formate gibt, müssen diese entweder durch ein Komma, ein Leerzeichen, eine neue Zeile oder eine Kombination davon getrennt werden
  • Sie müssen die genauen Namen der Formate ausgeben. Die Verwendung unterschiedlicher beliebiger Werte ist nicht zulässig.
  • Es sind keine führenden oder nachfolgenden Zeichen außer einem nachgestellten Leerzeichen zulässig
  • Die Ausgabe muss in Kleinbuchstaben erfolgen
  • Sie dürfen keine integrierten Datums- oder Kalenderfunktionen verwenden
  • Die Ausgabeformate müssen nicht sortiert werden

Beispiele

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

Dies ist also gewinnt der kürzeste Code in Bytes. Erklärungen sind erwünscht.

Jim
quelle
3
Sie sollten wahrscheinlich einen Testfall mit dem 31. Februar hinzufügen, um sicherzustellen, dass die Antworten diesen seltsamen Fall unterstützen: P
ETHproductions
Können wir drei unterschiedliche Werte für die drei gültigen Formate ausgeben oder müssen es diese drei exakten Zeichenfolgen sein?
ETHproductions
3
there are 31 days for every month of the year, and consequently no leap yearsDas heißt also, dass jede Datumsbibliothek dafür effektiv nutzlos ist?
TheLethalCoder
1
@TheLethalCoder Ja, die meisten Datumsbibliotheken sind wahrscheinlich unbrauchbar.
Jim
1
Es gibt viele weitere Formate .
Ugoren

Antworten:

3

05AB1E , 40 Bytes

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

Probieren Sie es online aus!

Erläuterung

'-¡©                                      # 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
Emigna
quelle
4

Python 2 , 123 Bytes

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),

Probieren Sie es online aus!


Python 2 , weniger Parsing von Eingaben, 123 Bytes

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),

Probieren Sie es online aus!

ovs
quelle
Sie dürfen sich mit Zeilenumbrüchen trennen, um die nachgestellten Zeilen zu entfernen ,.
Jonathan Allan
4

JavaScript (ES6), 121 119 118 112 Byte

Gibt eine durch Leerzeichen getrennte Zeichenfolge mit einem nachgestellten Leerzeichen zurück.

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``

Wie?

Wir teilen die Eingabe in a , b und c auf . Da das Datum garantiert gültig ist, wissen wir mit Sicherheit, dass b kleiner als 32 ist. Daher reicht es aus, zu testen, ob a kleiner als 13 ist, um das Middle-Endian-Format zu validieren. Für Little-Endian- und Big-Endian-Formate muss b kleiner als 13 sein und ein weiterer Test für a bzw. c , um den Tag zu validieren.

Daher die 3 Tests:

  • Big-Endian: b <13 & c <32
  • Little-Endian: b <13 & a <32
  • Middle-Endian: a <13

Testfälle

Arnauld
quelle
3

Bash, 240 125 116 112 Bytes

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

Golf gespielt.

Danke an manatwork für ein paar Tipps

Es wurden 9 Bytes gespeichert, wodurch die Überprüfung für weniger als 32 in der folgenden Arnauld-Antwort im mittleren Endian entfernt wurde

4 Bytes wurden gespeichert, indem anstelle eines Arrays verschiedene Variablen verwendet wurden

Probier es aus!

DrnglVrgs
quelle
In Tipps zum Golfen in Bash finden Sie einige Tipps zum Rechnen . Sie könnten es ein wenig reduzieren: Probieren Sie es online aus!
Manatwork
Vielen Dank @manatwork Ich habe diese Frage mit einem Lesezeichen versehen ist sehr nützlich, wird es dadurch Golf spielen
DrnglVrgs
1

C #, 180 Bytes

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":"")}";};

Ausgaben mit nur durch Leerzeichen getrennten Werten können auch führende und nachfolgende Leerzeichen enthalten. Wird bei Bedarf aktualisiert, wenn das OP dies geklärt hat.

Vollversion / Formatierte Version:

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" : "")}";
};
TheLethalCoder
quelle
Ich machte die Regel klarer:No leading or trailing characters others than a trailing space are allowed
Jim
1

PHP, 151 Bytes

[$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:"";

Testfälle

Jörg Hülsermann
quelle
1

Stapel, 138 Bytes

@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

Vage basierend auf der Antwort von @ ovs.

Neil
quelle
1

Java 232 Bytes

(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);}

Hier ist eine schönere Version

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

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

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

Ich wusste nicht wirklich, wie ich diesen Teil formatieren sollte ...

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
);
cheemcheem
quelle
1
Zu viele Endianer : String e="-endian",b="big"+e,m="middle"+e,l="little"+e;.
Manatwork
Guter Punkt, als ich mich entschied, dies nicht zu tun, habe ich einen zusätzlichen "String" in meine Byteanzahl aufgenommen. @ Manatwork
Cheemcheem
1

PHP, 131 Bytes

[$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 ":"";
user63956
quelle