Días comprimidos de la semana

18

Dada una entrada de una lista de días de la semana, genera la representación ordenada más corta de la lista.

El formato de la entrada es una cadena que consta de una o más de las subseries de dos caracteres Su(domingo), Mo(lunes), Tu(etc.), We, Th, Fr, y Sa. La entrada no necesariamente se puede dar en orden ordenado.

Para convertir la entrada al formato de salida,

  • Ordene la entrada por día de la semana, comenzando desde el domingo (ej. ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • Reduzca las abreviaturas a una letra si no deja ambigüedad . Por ejemplo, SuMoTuWedebería ser SMTWporque la primera S no podría ser el sábado, ya que eso haría que la salida no estuviera ordenada (lo mismo para la T). Sin embargo, ThFrSadebería convertirse ThFS, ya que tanto el martes como el jueves son anteriores al viernes y reducirlo a TFScrearía ambigüedad.

  • Si la salida es ahora MTWTF, salida en su Dlugar (que significa " día de la semana s"). Del mismo modo, SSdebe hacerse Epara fin de semana . Finalmente, SMTWTFSdebería hacerse Apara todos los días.

La entrada y la salida deben ser una sola cadena.

Como se trata de , gana el código más corto en bytes.

Casos de prueba:

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
Pomo de la puerta
fuente
Solo leer esto me hace sentir que es MMMM
Lui
66
Solo pienso: ¡WTF, y es fin de semana!
antes del
STFU! Oh, eso no funciona ...: D
flawr

Respuestas:

6

Retina , 152 88

¡Practica golf masivo con la ayuda de @ Martin y @ randomra! ¡Gracias a los dos!

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

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

Pruébalo en línea. Un par de líneas comienzan m`con este enlace de intérprete en línea. Esto es para que el programa funcione con múltiples líneas de entrada (para ejecutar todas las pruebas de una sola vez). Sin embargo, varias líneas de entrada no son un requisito, por lo que no están incluidas arriba ni en mi puntaje.

Trauma digital
fuente
1
Dang, estaba emocionado cuando finalmente aplasté el mío por debajo de tu 152. No puedo vencer esto ahora XD Muy buenos chicos =)
Mwr247
T`l``Su\B|\BSa|.*e.*|uTh|o|rahorra 3 bytes más.
randomra
5

JavaScript (ES7), 187 178 168 157 143 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)

Las pruebas de expresiones regulares ayudaron a hacer un trabajo rápido de las reglas especiales del día, y aunque no son ideales, el mapa de objetos hace su trabajo. Sin embargo, estoy seguro de que puedo exprimir un poco más de esto.

Mwr247
fuente
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']

Prueba de ideona

Cameron Aavik
fuente
¡Lo convertiste en un forro (realmente largo)!
TanMath
'Su Mo Tu We Th Fr Sa'.split()es más corto 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"`)

Explicación

Codifica cada día como un bit y almacena la entrada como un número n. Bit 0 = domingo ... bit 6 = sábado. Esto permite que el código de verificación de la regla de ambigüedad sea mucho más corto debido a las operaciones de bits y poder comparar la combinación completa con un número que siempre es 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"
  `)

Prueba

usuario81655
fuente