Jours compressés de la semaine

18

Étant donné l'entrée d'une liste de jours de la semaine, affichez la représentation triée la plus courte de la liste.

Le format de l'entrée est une chaîne constituée d'un ou plusieurs des sous - chaînes à deux caractères Su(dimanche), Mo(lundi), Tu(etc.), We, Th, FretSa . L'entrée ne peut pas nécessairement être donnée dans un ordre trié.

Pour convertir l'entrée au format de sortie,

  • Triez l'entrée par jour de la semaine, à partir du dimanche (ex. ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • Réduisez les abréviations à une seule lettre si elle ne laisse aucune ambiguïté . Par exemple, SuMoTuWedevrait devenir SMTWparce que le premier S ne pourrait pas être possible samedi, car cela rendrait la sortie non triée (idem pour le T). Cependant, cela ThFrSadevrait devenir ThFS, car le mardi et le jeudi précèdent le vendredi et le réduire pour TFScréer une ambiguïté.

  • Si la sortie est maintenant MTWTF, sortie à la Dplace (qui signifie " jour de la semaine "). De même, SSdevrait devenir Epour le week- end . Enfin, SMTWTFSdevrait devenir Apour tous les jours.

L'entrée et la sortie doivent toutes deux être une seule chaîne.

Puisqu'il s'agit de , le code le plus court en octets l'emporte.

Cas de test:

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
Poignée de porte
la source
Le simple fait de lire ceci me donne l'impression que c'est MMMM
Lui
6
Je pense juste: WTF, et c'est le week-end!
agtoever
STFU! Oh, ça ne marche pas ...: D
flawr

Réponses:

6

Rétine , 152 88

Golfez massivement avec l'aide de @ Martin et @ randomra! Merci à vous deux!

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

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

Essayez-le en ligne. Quelques lignes commencent m`par ce lien d'interprète en ligne. C'est ainsi que le programme fonctionne avec plusieurs lignes d'entrée (pour exécuter tous les tests en une seule fois). Cependant, plusieurs lignes d'entrée ne sont pas obligatoires, elles ne sont donc pas incluses ci-dessus ou dans ma partition.

Traumatisme numérique
la source
1
Dang, j'étais excité quand j'ai finalement écrasé le mien en dessous de votre 152. Je ne peux pas battre ça maintenant XD Very nice guys =)
Mwr247
T`l``Su\B|\BSa|.*e.*|uTh|o|renregistre 3 octets supplémentaires.
randomra
5

JavaScript (ES7), 187 178 168 157 157 143 octets

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)

Les tests d'expressions régulières ont permis de travailler rapidement sur les règles spéciales du jour, et bien que moins qu'idéal, la carte d'objet fonctionne. Je suis certain que je peux en tirer un peu plus.

Mwr247
la source
2

Python 3, 321 octets

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

Test sur ideone

Cameron Aavik
la source
Vous en avez fait une (vraiment longue) doublure!
TanMath
'Su Mo Tu We Th Fr Sa'.split()est plus court que['Su','Mo','Tu','We','Th','Fr','Sa']
Sherlock9
2

JavaScript (ES6), 197 octets

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

Explication

Encode chaque jour sous forme de bit et stocke l'entrée sous forme de nombre n. Bit 0 = dimanche ... bit 6 = samedi. Cela permet au code de vérification des règles d'ambiguïté d'être beaucoup plus court en raison des opérations au niveau des bits et de pouvoir comparer la combinaison entière avec un nombre toujours inférieur à 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"
  `)

Tester

user81655
la source