Qual é esse formato de data?

11

Para calendários gregorianos, o formato da data varia de um país para outro. Existem três formatos principais reconhecidos:

  1. YY-MM-DD (big endian)
  2. DD-MM-YY (pequeno endian)
  3. MM-DD-YY (endian médio)

Sua tarefa é escrever um programa que, dada uma sequência de entrada representando uma data, produza todos os formatos de data possíveis pelos quais essa sequência pode ser interpretada como uma data.

Regras

  • A data de entrada está no formato xx-xx-xx, onde cada campo tem dois dígitos e preenchimento com zero.
  • A data é sempre válida (portanto, você não pode obter coisas como 14-13-17)
  • A data é sempre pelo menos um dos formatos acima (portanto, você não pode obter coisas como 17-14-11)
  • Como estamos de fato em um mundo paralelo, existem 31 dias para cada mês do ano e, consequentemente, nenhum ano bissexto.
  • A data é entre 01 de janeiro de 2001 e 31 de dezembro de 2099
  • Se houver apenas um formato para a data, o código deverá imprimi-lo apenas (somente novas linhas à direita são permitidas)
  • Se houver vários formatos para a data, eles deverão ser separados por vírgula, espaço, nova linha ou uma combinação desses
  • Você deve exibir o nome exato do (s) formato (s). O uso de valores arbitrários distintos não é permitido.
  • Nenhum caractere inicial ou final, exceto um espaço final, é permitido
  • A saída deve estar em minúscula
  • Você não tem permissão para usar nenhuma função interna de data ou calendário
  • Os formatos de saída não precisam ser classificados

Exemplos

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

Isso é portanto o código mais curto em bytes vence. As explicações são incentivadas.

Jim
fonte
3
Você provavelmente deve adicionar um caso de teste usando 31 de fevereiro para garantir que as respostas suportem esse caso estranho: P
ETHproductions
Podemos produzir três valores distintos para os três formatos válidos ou devem ser essas três seqüências exatas?
ETHproductions
3
there are 31 days for every month of the year, and consequently no leap yearsEntão isso significa que qualquer biblioteca de datas é efetivamente inútil para isso?
TheLethalCoder
11
@TheLethalCoder Sim, a maioria das bibliotecas de datas provavelmente não pode ser usada.
30717 Jim
11
Existem muitos outros formatos por aí.
Ugoren

Respostas:

3

05AB1E , 40 bytes

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

Experimente online!

Explicação

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

Experimente online!


Python 2 , menos análise de entrada, 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),

Experimente online!

ovs
fonte
Você pode separar com novas linhas, para remover a linha final ,.
Jonathan Allan
4

JavaScript (ES6), 121 119 118 112 bytes

Retorna uma string delimitada por espaço com um espaço à direita.

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

Como?

Nós dividimos a entrada em um , b e c . Como a data é garantida como válida, sabemos com certeza que b é menor que 32. Portanto, é suficiente testar se a é menor que 13 para validar o formato da extremidade média. Os formatos little endian e big endian exigem que b seja menor que 13 e outro teste em a e c, respectivamente, para validar o dia.

Daí os 3 testes:

  • Big endian: b <13 & c <32
  • Little-endian: b <13 e a <32
  • Meio-endiano: a <13

Casos de teste

Arnauld
fonte
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

Golfed.

Obrigado ao manatwork por algumas dicas

Salvou 9 bytes removendo a verificação para menos de 32 na resposta Arnauld da meia-extremidade seguinte

4 bytes salvos usando variáveis ​​diferentes em vez de uma matriz

Teste-o!

DrnglVrgs
fonte
Existem algumas dicas relacionadas à aritmética em Dicas para jogar golfe no Bash . Você pode reduzir um pouco: Experimente online!
manatwork
Obrigado @manatwork tenho essa pergunta marcada é muito útil, golfe vontade que por ela
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":"")}";};

Saídas com apenas valores separados por espaço, também podem ter espaços à esquerda e à direita. Será atualizado quando o OP tiver esclarecido sobre esse ponto, se necessário.

Versão completa / formatada:

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
fonte
Eu deixei a regra mais clara: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:"";

Casos de teste

Jörg Hülsermann
fonte
1

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

Vagamente baseado na resposta de @ ovs.

Neil
fonte
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);}

Aqui está uma versão melhor

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

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

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

Eu realmente não sabia como formatar esta 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
);
cheemcheem
fonte
11
Demasiados endians: String e="-endian",b="big"+e,m="middle"+e,l="little"+e;.
Manatwork
Bom ponto, quando decidi não fazer isso, estava incluindo uma "String" extra na minha contagem de bytes. @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
fonte