Dias da semana compactados


18

Dada a entrada de uma lista de dias da semana, produza a representação ordenada mais curta da lista.

O formato da entrada é uma cadeia que consiste em um ou mais dos substrings de dois caracteres Su(domingo), Mo(segunda-feira), Tu(etc.), We, Th, Fr, e Sa. A entrada pode não ser necessariamente fornecida em ordem classificada.

Para converter a entrada no formato de saída,

  • Classifique a entrada por dia da semana, começando no domingo (ex. ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • Reduza as abreviações para uma letra se não deixar ambiguidade . Por exemplo, SuMoTuWedeve se tornar SMTWporque o primeiro S não poderia ser possível no sábado, pois isso tornaria a saída não classificada (o mesmo para o T). No entanto, ThFrSadeve se tornar ThFS, já que terça e quinta-feira acontecem antes da sexta-feira e reduzi-la para TFScriar ambiguidade.

  • Se a saída for agora MTWTF, em Dvez disso (que significa " dia da semana s"). Da mesma forma, SSdeve se tornar Epara o final de semana . Finalmente, SMTWTFSdeve se tornar Apara todos os dias.

A entrada e a saída devem ser uma única sequência.

Como esse é o , o código mais curto em bytes vence.

Casos de teste:

In              Out    | In              Out
-----------------------|--------------------
SuTu            STu    | SuTuWe          STW
SuTuSa          STuS   | SuWeTh          SWT
TuThSa          TTS    | TuThSu          STT
Su              Su     | Sa              Sa
WeTh            WT     | FrTh            ThF
WeTu            TW     | FrTu            TuF
FrWeMo          MWF    | SaWeSu          SWS
ThTu            TT     | We              W
ThTuMoFrWe      D      | SaSu            E
SuMoWeTuThFr    SMTWTF | ThMoSaSuFrTuWe  A

Basta ler isso me faz sentir como se fosse MMMM
Lui

6
Eu apenas penso: WTF, e é fim de semana!
agtoever 14/01

STFU! Ah, isso não funciona ...: D
flawr

Respostas:


6

Retina , 152 88

Jogou golfe com a ajuda de @ Martin e @ randomra! Obrigado a vocês dois!

^
SuMoTuWeThFrSa
([A-Z].)(?!.*\1)

T`l``Su\B|\BSa|o|r|u?We.?.?|uTh
^MTWTF$
D
SS
E
.{7}
A

Experimente online. Algumas linhas começam m`com este link de intérprete online. É assim que o programa trabalha com várias linhas de entrada (para executar todos os testes de uma vez). No entanto, várias linhas de entrada não são um requisito, portanto elas não estão incluídas acima ou na minha pontuação.


1
Dang, eu estava animado quando eu finalmente esmagado mina abaixo do seu 152. Não pode bater este agora XD Muito nice guys =)
Mwr247

T`l``Su\B|\BSa|.*e.*|uTh|o|reconomiza mais 3 bytes.
randomra

5

JavaScript (ES7), 187 178 168 157 157 bytes

x=>({SMTWTFS:'A',SS:'E',MTWTF:'D'}[x=[for(a of'Su M Tu W Th F Sa'.split` `)if(x.match(a))x.match({S:/.../,T:/W|T.*T/}[b=a[0]])?b:a].join``]||x)

Os testes regex ajudaram a fazer o trabalho rápido das regras especiais do dia e, embora menos do que o ideal, o mapa de objetos faz seu trabalho. Estou certo de que posso extrair mais um pouco disso.


2

Python 3, 321 bytes

def w(n,a=lambda b,c,d:b.replace(c[0],d).replace(c[1],d)):d=''.join([[o[0],o][o[0]in'ST']for o in['Su','Mo','Tu','We','Th','Fr','Sa']if o in[n[i:i+2]for i in range(0,len(n),2)]]);d=[d,a(d,['Tu','Th'],'T')][('W'in d)+('TuT'in d)];l=len(d);d=[d,a(d,['Su','Sa'],'S')][l>2];return[[[d,'A'][l>8],'E'][d=='SS'],'D'][d=='MTWTF']

Teste em ideone


Você fez um (realmente longo) um forro!
precisa saber é o seguinte

'Su Mo Tu We Th Fr Sa'.split()é mais curto que['Su','Mo','Tu','We','Th','Fr','Sa']
Sherlock9

2

JavaScript (ES6), 197 bytes

s=>eval(`n=0;d="SuMoTuWeThFrSa";s.match(/../g).map(t=>n|=1<<d.search(t)/2);o="";for(i=0;i<7;i++)n&1<<i?o+=d.substr(i*2,n<2|n==64|(!(n&8|(n&20)>19)&&i==2|i==4)?2:1):0;n-127?n-62?n-65?o:"E":"D":"A"`)

Explicação

Codifica cada dia como um pouco e armazena a entrada como um número n. Bit 0 = domingo ... bit 6 = sábado. Isso permite que a regra de ambiguidade verifique o código seja muito menor devido às operações bit a bit e seja capaz de comparar toda a combinação com um número sempre menor que 128.

s=>
  eval(`                   // eval enables the for loop without {} or return
    n=0;                   // n = input encoded as a number
    d="SuMoTuWeThFrSa";    // d = day strings
    s.match(/../g).map(t=> // for each day string t in the input
      n|=1<<d.search(t)/2  // set the bit in n that corresponds to the day
    );
    o="";                  // o = output string
    for(i=0;i<7;i++)       // for each day i from Sunday to Monday
      n&1<<i?              // if the day was in the input
        o+=d.substr(i*2,   // add the day string to the output
          n<2              // Sunday by itself is ambiguous
          |n==64           // Saturday by itself is ambiguous
          |(!(n&8          // Without Wednesday...
            |(n&20)>19     // ...or both Tuesday and Thursday,
            )&&i==2|i==4)  // ...Tuesday or Thursday are ambiguous
          ?2:1             // 2 characters if ambiguous, else 1
        )
      :0;
    n-127?                 // n == 127 = All days (A)
      n-62?                // n == 62 = All week days (D)
        n-65?              // n == 65 = All weekend days (E)
          o                // else output the constructed string
        :"E"
      :"D"
    :"A"
  `)

Teste

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.