Che cos'è questo formato data?


11

Per i calendari gregoriani, il formato della data varia da un paese all'altro. Sono riconosciuti tre formati principali:

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

Il tuo compito è scrivere un programma che, data una stringa di input che rappresenta una data, emetta tutti i possibili formati di data con cui questa stringa può essere interpretata come una data.

Regole

  • La data di input è nel formato xx-xx-xx, in cui ogni campo è composto da due cifre e con zero.
  • La data è sempre valida (quindi non è possibile ottenere cose come 14-13-17)
  • La data è sempre almeno uno dei formati sopra (quindi non puoi ottenere cose come 17-14-11)
  • Poiché in realtà siamo in un mondo parallelo, ci sono 31 giorni per ogni mese dell'anno e, di conseguenza, nessun anno bisestile
  • La data è compresa tra il 1 ° gennaio 2001 e il 31 dicembre 2099
  • Se esiste un solo formato per la data, il codice deve stamparlo solo (sono consentite solo le nuove righe finali)
  • Se esistono diversi formati per la data, devono essere separati da una virgola, uno spazio, una nuova riga o una combinazione di questi
  • Devi generare il nome esatto del formato. L'uso di valori arbitrari distinti non è consentito.
  • Non sono consentiti caratteri iniziali o finali diversi da uno spazio finale
  • L'output deve essere in minuscolo
  • Non è consentito utilizzare alcuna funzione di calendario o data integrata
  • I formati di output non devono essere ordinati

Esempi

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

Questo è quindi vince il codice più breve in byte. Le spiegazioni sono incoraggiate.


3
Probabilmente dovresti aggiungere un test case utilizzando il 31 febbraio per assicurarti che le risposte supportino questo strano caso: P
ETHproductions

Possiamo generare tre valori distinti per i tre formati validi o devono essere quelle tre stringhe esatte?
ETHproductions

3
there are 31 days for every month of the year, and consequently no leap yearsQuindi questo significa che qualsiasi libreria di date è effettivamente inutile per questo allora?
TheLethalCoder

1
@TheLethalCoder Sì, la maggior parte delle librerie di date sono probabilmente inutilizzabili.
Jim,

1
Ci sono molti altri formati là fuori.
ugoren,

Risposte:


3

05AB1E , 40 byte

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

Provalo online!

Spiegazione

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

4

Python 2 , 123 byte

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

Provalo online!


Python 2 , meno analisi di input, 123 byte

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

Provalo online!


Puoi separare con le nuove righe, in modo da poter rimuovere il finale ,.
Jonathan Allan,

4

JavaScript (ES6), 121 119 118 112 byte

Restituisce una stringa delimitata da spazi con uno spazio finale.

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

Come?

Abbiamo diviso l'input in un , b e c . Poiché la data è garantita per essere valida, sappiamo per certo che b è inferiore a 32. Pertanto, è sufficiente verificare se a è inferiore a 13 per convalidare il formato di fascia medio. I formati little-endian e big-endian richiedono che b sia inferiore a 13 e un altro test su a e c rispettivamente per convalidare la giornata.

Da qui i 3 test:

  • Big-endian: b <13 & c <32
  • Little-endian: b <13 e a <32
  • Endiano medio: a <13

Casi test


3

Bash, 240 125 116 112 byte

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

Golfed.

Grazie a manatwork per alcuni suggerimenti

Salvataggio di 9 byte rimuovendo la verifica per meno di 32 nella risposta di Arnauld che segue la fascia media

Salvato 4 byte utilizzando variabili diverse anziché una matrice

Provalo!


Ci sono un paio di consigli aritmetici in Suggerimenti per giocare a golf a Bash . Potresti ridurlo un po ': provalo online!
arte

Grazie @manatwork Ho che la domanda aggiunta ai segnalibri è molto utile, la
giocherò

1

C #, 180 byte

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

Gli output con solo valori separati da spazio, possono anche avere spazi iniziali e finali. Si aggiornerà quando il PO ha chiarito questo punto, se necessario.

Versione completa / formattata:

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

Ho chiarito la regola:No leading or trailing characters others than a trailing space are allowed
Jim,

1

PHP, 151 byte

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

Casi test


1

Lotto, 138 byte

@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

Vagamente basato sulla risposta di @ ovs.


1

Java 232 byte

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

Ecco una versione migliore

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

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

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

Non sapevo davvero come formattare questa parte ...

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

1
Troppi endians: String e="-endian",b="big"+e,m="middle"+e,l="little"+e;.
arte

Buon punto, quando ho deciso di non farlo, ho aggiunto una "stringa" in più nel mio conteggio di byte. @manatwork
cheemcheem,

1

PHP, 131 byte

[$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 ":"";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.