วันที่บีบอัดของสัปดาห์


18

กำหนดอินพุตของรายการวันในสัปดาห์เอาท์พุทการเรียงลำดับที่สั้นที่สุดของรายการ

รูปแบบของการป้อนข้อมูลที่เป็นสตริงประกอบด้วยหนึ่งหรือมากกว่าของสตริงสองตัวอักษรSu(วันอาทิตย์), Mo(วันจันทร์) Tu( ฯลฯ ) We, Th, และFr Saอินพุตอาจไม่จำเป็นต้องถูกจัดเรียงตามลำดับ

ในการแปลงอินพุตเป็นรูปแบบเอาต์พุต

  • จัดเรียงอินพุตตามวันในสัปดาห์โดยเริ่มจากวันอาทิตย์ (เช่นThMoSaSuFrTuWe-> SuMoTuWeThFrSa)

  • ลดตัวย่อลงไปหนึ่งตัวอักษรถ้ามันไม่มีใบความคลุมเครือ ตัวอย่างเช่นSuMoTuWeควรเป็นSMTWเพราะ S ตัวแรกไม่สามารถเป็นวันเสาร์ได้เนื่องจากจะทำให้เอาต์พุตไม่ได้เรียงลำดับ (เหมือนกันสำหรับ T) อย่างไรก็ตามThFrSaควรเป็นThFSเช่นวันอังคารและวันพฤหัสบดีมาก่อนวันศุกร์และลดลงเพื่อTFSสร้างความกำกวม

  • หากเอาท์พุทเป็นตอนนี้MTWTFเอาท์พุทDแทน (ซึ่งหมายถึง "สัปดาห์วัน ") ในทำนองเดียวกันSSควรจะเป็นEสำหรับสัปดาห์สิ้นสุด ในที่สุด SMTWTFSควรกลายเป็นAสำหรับทุกวัน

ทั้งอินพุตและเอาต์พุตต้องเป็นสตริงเดี่ยว

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ:

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

แค่อ่านสิ่งนี้ทำให้ฉันรู้สึกว่ามันเป็น MMMM
ลุย

6
ฉันแค่คิดว่า: WTF และมันเป็นวันหยุดสุดสัปดาห์!
ว่าจะ

หุบปาก! โอ้นั่นไม่ได้ผล ... : D
ข้อผิดพลาด

คำตอบ:


6

เรติน่า , 152 88

เล่นกอล์ฟอย่างหนาแน่นด้วย @ Martin's และ @ randomra's help! ขอบคุณทั้งคู่!

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

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

ลองออนไลน์ สองสามบรรทัดเริ่มต้นด้วยm`ลิงค์ล่ามออนไลน์นี้ นี่คือโปรแกรมทำงานกับอินพุตหลายบรรทัด (เพื่อรันการทดสอบทั้งหมดในช็อตเดียว) อย่างไรก็ตามอินพุตหลายบรรทัดไม่ใช่ข้อกำหนดดังนั้นสิ่งเหล่านี้จึงไม่รวมอยู่ในคะแนนของฉัน


1
แดงฉันรู้สึกตื่นเต้นเมื่อในที่สุดฉันก็ระเบิดของฉันต่ำกว่า 152 ของคุณไม่สามารถเอาชนะได้ตอนนี้ XD คนดีมาก =)
Mwr247

T`l``Su\B|\BSa|.*e.*|uTh|o|rบันทึกอีก 3 ไบต์
Randomra

5

JavaScript (ES7), 187 178 168 157 143 ไบต์

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)

การทดสอบ regex ช่วยให้ทำงานได้อย่างรวดเร็วในวันพิเศษและในขณะที่น้อยกว่าอุดมคติแมปวัตถุจะทำงานได้ ฉันแน่ใจว่าฉันสามารถบีบออกได้มากกว่านี้


2

Python 3, 321 ไบต์

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

ทดสอบบน ideone


คุณทำให้มันเป็นหนึ่งซับ (ยาวจริงๆ)!
TanMath

'Su Mo Tu We Th Fr Sa'.split()สั้นกว่า['Su','Mo','Tu','We','Th','Fr','Sa']
Sherlock9

2

JavaScript (ES6), 197 ไบต์

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

คำอธิบาย

nถอดรหัสในแต่ละวันเป็นบิตและร้านค้าการป้อนข้อมูลที่เป็นตัวเลข บิต 0 = วันอาทิตย์ ... บิต 6 = วันเสาร์ วิธีนี้ช่วยให้รหัสตรวจสอบกฎความกำกวมสั้นลงมากเนื่องจากการทำงานของบิตที่ชาญฉลาดและสามารถเปรียบเทียบชุดค่าผสมทั้งหมดกับตัวเลขที่น้อยกว่า 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"
  `)

ทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.