Ngày nén trong tuần


18

Đưa ra một đầu vào của một danh sách các ngày trong tuần, xuất ra đại diện được sắp xếp ngắn nhất của danh sách.

Định dạng của đầu vào là một chuỗi gồm một hoặc nhiều chuỗi con hai ký tự Su(Chủ Nhật), Mo(thứ Hai), Tu(vv), We, Th, Fr, và Sa. Đầu vào có thể không nhất thiết phải được đưa ra theo thứ tự sắp xếp.

Để chuyển đổi đầu vào thành định dạng đầu ra,

  • Sắp xếp đầu vào theo ngày trong tuần, bắt đầu từ Chủ nhật (ví dụ ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • Giảm các chữ viết tắt xuống một chữ cái nếu nó không để lại sự mơ hồ . Ví dụ, SuMoTuWenên trở thành SMTWvì S đầu tiên không thể là thứ bảy, vì điều đó sẽ làm cho đầu ra không được sắp xếp (tương tự cho T). Tuy nhiên, ThFrSanên trở thành ThFS, vì cả thứ ba và thứ năm đến trước thứ sáu và giảm nó xuống TFSsẽ tạo ra sự mơ hồ.

  • Nếu đầu ra là bây giờ MTWTF, đầu ra Dthay thế (viết tắt của "tuần ngày s"). Tương tự, SSnên trở thành cuốiE tuần . Cuối cùng, nên trở thành cho tất cả các ngày.SMTWTFSA

Cả đầu vào và đầu ra phải là một chuỗi đơn.

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

Các trường hợp thử nghiệm:

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

Chỉ cần đọc điều này thôi cũng khiến tôi cảm thấy như đó là MMMM
Lui

6
Tôi chỉ nghĩ: WTF, và cuối tuần rồi!
bất cứ lúc nào

CẨN THẬN! Ồ, điều đó không hiệu quả ...: D
flawr

Câu trả lời:


6

Võng mạc , 152 88

Chơi golf ồ ạt với sự giúp đỡ của @ Martin và @ Randomra! Cảm ơn cả hai bạn!

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

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

Hãy thử trực tuyến. Một vài dòng bắt đầu với m`liên kết phiên dịch trực tuyến này. Điều này là để chương trình hoạt động với nhiều dòng đầu vào (để chạy tất cả các thử nghiệm trong một lần chụp). Tuy nhiên, nhiều dòng đầu vào không phải là một yêu cầu, vì vậy những dòng này không được bao gồm ở trên hoặc trong điểm số của tôi.


1
Dang, tôi đã rất phấn khích khi cuối cùng tôi đã hạ thấp tôi xuống dưới 152 của bạn. Không thể đánh bại điều này ngay bây giờ XD Những người rất tuyệt vời =)
Mwr247

T`l``Su\B|\BSa|.*e.*|uTh|o|rtiết kiệm thêm 3 byte.
ngẫu nhiên

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)

Các bài kiểm tra regex đã giúp thực hiện nhanh chóng các quy tắc trong ngày đặc biệt và trong khi không lý tưởng, bản đồ đối tượng thực hiện công việc đó. Tôi chắc chắn rằng tôi có thể vắt kiệt một vài trong số này mặc dù.


2

Python 3, 321 byte

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

Kiểm tra trên ideone


Bạn đã làm cho nó một (thực sự dài) một lót!
TanMath

'Su Mo Tu We Th Fr Sa'.split()ngắn hơn['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"`)

Giải trình

Mã hóa mỗi ngày dưới dạng một bit và lưu trữ đầu vào dưới dạng số n. Bit 0 = Chủ nhật ... bit 6 = Thứ bảy. Điều này cho phép mã kiểm tra quy tắc không rõ ràng ngắn hơn rất nhiều do các hoạt động khôn ngoan và có thể so sánh toàn bộ kết hợp với một số luôn nhỏ hơn 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"
  `)

Kiểm tra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.