Hari-hari terkompresi dalam seminggu

18

Diberikan input dari daftar hari dalam seminggu, menghasilkan representasi daftar yang paling pendek.

Format input adalah string yang terdiri dari satu atau lebih dari substring dua karakter Su(Minggu), Mo(Senin), Tu(dll), We, Th, Fr, dan Sa. Input mungkin tidak harus diberikan dalam urutan.

Untuk mengkonversi input ke format output,

  • Urutkan input berdasarkan hari dalam seminggu, mulai dari hari Minggu (mis. ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • Kurangi singkatan menjadi satu huruf jika tidak meninggalkan ambiguitas . Sebagai contoh, SuMoTuWeharus menjadi SMTWkarena S pertama tidak mungkin adalah hari Sabtu, karena itu akan membuat output tidak disortir (sama untuk T). Namun, ThFrSaharus menjadi ThFS, karena baik Selasa dan Kamis datang sebelum Jumat dan mengurangi itu TFSakan menciptakan ambiguitas.

  • Jika output sekarang MTWTF, output Dsebagai gantinya (yang merupakan singkatan dari "week day s"). Demikian pula, SSharus menjadi akhirE pekan . Akhirnya, harus menjadi untuk semua hari.SMTWTFSA

Input dan output keduanya harus berupa string tunggal.

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji:

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
Gagang pintu
sumber
Hanya membaca ini membuat saya merasa seperti MMMM
Lui
6
Saya hanya berpikir: WTF, dan ini akhir pekan!
Agustus
STFU! Oh, itu tidak berhasil ...: D
flawr

Jawaban:

6

Retina , 152 88

Bermain golf secara besar-besaran dengan bantuan @ Martin dan @ randomra! Terima kasih kalian berdua!

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

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

Cobalah online. Beberapa baris dimulai dengan m`tautan juru bahasa online ini. Ini agar program bekerja dengan beberapa jalur input (untuk menjalankan semua tes dalam satu kesempatan). Namun, beberapa jalur input bukan keharusan, jadi ini tidak termasuk di atas atau dalam skor saya.

Trauma Digital
sumber
1
Dang, saya sangat senang ketika saya akhirnya menekuk milik saya di bawah 152. Anda tidak bisa mengalahkan ini sekarang XD Orang yang sangat baik =)
Mwr247
T`l``Su\B|\BSa|.*e.*|uTh|o|rmenghemat 3 byte lagi.
randomra
5

JavaScript (ES7), 187 178 168 157 143 byte

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)

Tes regex membantu membuat kerja cepat aturan hari khusus, dan meskipun kurang dari ideal, peta objek tidak berfungsi. Saya yakin saya bisa memeras lebih banyak dari ini.

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

Uji ideone

Cameron Aavik
sumber
Anda membuat satu liner (sangat panjang)!
TanMath
'Su Mo Tu We Th Fr Sa'.split()lebih pendek dari['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"`)

Penjelasan

Mengkodekan setiap hari sedikit dan menyimpan input sebagai angka n. Bit 0 = Sunday ... bit 6 = Sabtu. Ini memungkinkan aturan pemeriksaan kode ambiguitas menjadi jauh lebih pendek karena operasi bit-wise dan mampu membandingkan seluruh kombinasi dengan angka yang selalu kurang dari 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"
  `)

Uji

pengguna81655
sumber