Komprimierte Wochentage

18

Bei Eingabe einer Liste von Wochentagen wird die kürzeste sortierte Darstellung der Liste ausgegeben.

Das Format des Eingangs ist eine Zeichenkette , die aus einem oder mehreren der zwei Zeichen - Strings Su(Sonntag), Mo(Montag), Tu(etc.), We, Th, Fr, und Sa. Die Eingabe muss nicht unbedingt in sortierter Reihenfolge erfolgen.

So konvertieren Sie die Eingabe in das Ausgabeformat:

  • Sortieren Sie die Eingabe nach Wochentag ab Sonntag (z. B. ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • Reduzieren Sie die Abkürzungen auf einen Buchstaben, wenn keine Mehrdeutigkeit vorliegt . Zum Beispiel SuMoTuWesollte es sein, SMTWdass das erste S nicht Samstag sein kann, da dies die Ausgabe unsortiert (dasselbe gilt für das T). Es ThFrSasollte jedoch so werden ThFS, dass sowohl Dienstag als auch Donnerstag vor Freitag liegen und eine Reduzierung zu TFSMehrdeutigkeiten führen würde.

  • Wenn die Ausgabe jetzt ist der MTWTFAusgang Dstatt (das steht für „Woche Tag s“). In ähnlicher Weise SSsollte sich Efür Woche Ende . Endlich SMTWTFSsollte es Afür alle Tage werden.

Die Eingabe und Ausgabe müssen beide eine einzelne Zeichenfolge sein.

Da es sich um , der kürzeste Code in Bytes gewinnt.

Testfälle:

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
Türknauf
quelle
Schon beim Lesen fühle ich mich wie MMMM
Lui
6
Ich denke nur: WTF, und es ist Wochenende!
Am
STFU! Oh, das geht nicht ...: D
flawr

Antworten:

6

Retina , 152 88

Mit @ Martins und @ Randomras Hilfe massiv golfen! Danke euch beiden!

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

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

Probieren Sie es online aus. Einige Zeilen beginnen m`mit diesem Online-Interpreter-Link. Dies ist so, dass das Programm mit mehreren Eingabezeilen arbeitet (um alle Tests auf einmal auszuführen). Mehrere Eingabezeilen sind jedoch keine Voraussetzung, daher sind diese nicht über oder in meiner Partitur enthalten.

Digitales Trauma
quelle
1
Verdammt, ich war aufgeregt, als ich meine endlich unter deine 152 gequetscht habe. Kann das jetzt nicht schlagen XD Sehr nette Leute =)
Mwr247
T`l``Su\B|\BSa|.*e.*|uTh|o|rSpart 3 weitere Bytes.
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)

Die Regex-Tests haben dazu beigetragen, die speziellen Tagesregeln schnell umzusetzen, und obwohl sie nicht ideal sind, funktioniert die Objektzuordnung. Ich bin mir sicher, dass ich noch ein paar mehr herausholen kann.

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

Test auf Ideone

Cameron Aavik
quelle
Du hast es zu einem (wirklich langen) Einzeiler gemacht!
TanMath
'Su Mo Tu We Th Fr Sa'.split()ist kürzer als['Su','Mo','Tu','We','Th','Fr','Sa']
Sherlock9
2

JavaScript (ES6), 197 Byte

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

Erläuterung

Kodiert jeden Tag als Bit und speichert die Eingabe als Zahl n. Bit 0 = Sonntag ... Bit 6 = Samstag. Dies ermöglicht, dass der Mehrdeutigkeitsregelprüfcode aufgrund der bitweisen Operationen viel kürzer ist und in der Lage ist, die gesamte Kombination mit einer Zahl zu vergleichen, die immer kleiner als 128 ist.

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

Prüfung

user81655
quelle