Haftanın sıkıştırılmış günleri


18

Haftanın günleri listesinin bir girdisi verildiğinde, listenin en kısa sıralı gösterimini çıktılayın.

Girdi biçimi bir ya iki karakterlik alt dizilerden daha fazlasını içeren bir dizedir Su(Pazar), Mo(Pazartesi), Tu(vs), We, Th, Fr, ve Sa. Girdi, sıralı bir şekilde verilmeyebilir.

Girdiyi çıktı biçimine dönüştürmek için,

  • Girişi Pazar gününden başlayarak haftanın gününe göre sıralayın (ör. ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • Belirsizlik bırakmıyorsa , kısaltmaları bir harfe indirin . Örneğin, SuMoTuWehaline gelmelidir SMTWilk S Cumartesi olabileceğini mümkün değil çünkü bu sıralanmamış çıkışı (T için aynı) yapar gibi. Ancak ThFrSahaline gelmelidir ThFSSalı ve Perşembe hem Cuma öncesi ve birine indiren geldikçe, TFSbelirsizlik yaratacak.

  • Çıktı şimdi ise MTWTF, Dbunun yerine çıktı ("hafta gün " anlamına gelir ). Benzer şekilde, hafta sonu için de SSolmalıdır . Son olarak, tüm günler için olmalı .ESMTWTFSA

Giriş ve çıktının her ikisi de tek bir dize olmalıdır.

Bu , bayt cinsinden en kısa kod kazanır.

Test senaryoları:

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

Bunu okumak beni MMMM gibi hissettiriyor
Lui

6
Sadece düşünüyorum: WTF ve hafta sonu!
agtoever

STFU! Oh, bu işe yaramıyor ...: D
flawr

Yanıtlar:


6

Retina , 152 88

@ Martin ve @ randomra'nın yardımıyla kitlesel golf oynadı! İkinizide tesekkurler!

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

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

Çevrimiçi deneyin. Birkaç satır m`, bu çevrimiçi tercüman bağlantısıyla başlar. Bu, programın birden fazla giriş çizgisiyle (tüm testleri tek seferde çalıştırmak için) çalışmasıdır. Ancak, birden fazla giriş satırı bir gereklilik değildir, bu yüzden bunlar yukarıda veya puanımda yer almamaktadır.


1
Dang, sonunda senin 152 benim altında
ezilmiş

T`l``Su\B|\BSa|.*e.*|uTh|o|r3 bayt daha kaydeder.
randomra

5

JavaScript (ES7), 187 178 168 157 143 bayt

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)

Normal ifade testleri, özel gün kurallarının hızlı bir şekilde çalışmasına yardımcı oldu ve ideal olandan daha az olsa da, nesne haritası işe yarıyor. Eminim bundan biraz daha fazlasını sıkıştırabilirim.


2

Python 3, 321 Bayt

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

İdeone üzerinde test


(Gerçekten uzun) bir astar yaptın!
TanMath

'Su Mo Tu We Th Fr Sa'.split()daha kısadır['Su','Mo','Tu','We','Th','Fr','Sa']
Sherlock9

2

JavaScript (ES6), 197 bayt

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

açıklama

Her günü biraz kodlar ve girişi sayı olarak kaydeder n. Bit 0 = Pazar ... bit 6 = Cumartesi. Bu, belirsizlik kuralı kontrol kodunun bit-bilge işlemleri nedeniyle çok daha kısa olmasına ve tüm kombinasyonu her zaman 128'den küçük bir sayı ile karşılaştırabilmesine olanak tanır.

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

Ölçek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.