압축 요일


18

요일 목록을 입력하면 목록의 가장 짧은 정렬 된 표현을 출력합니다.

입력 형식은 하나 또는 두 문자 문자열 더 구성된 문자열 Su(일) Mo(월), Tu(등), We, Th, Fr, 및 Sa. 입력이 반드시 정렬 된 순서로 제공 될 필요는 없습니다.

입력을 출력 형식으로 변환하려면

  • 일요일부터 시작하여 요일별로 입력을 정렬하십시오 (예 : ThMoSaSuFrTuWe-> SuMoTuWeThFrSa).

  • 모호성을 남기지 않으면 약어를 한 글자로 줄이십시오 . 예를 들어, 첫 번째 S가 토요일 SuMoTuWe이 될 수 SMTW없기 때문에 출력이 정렬되지 않기 때문에 되어야 합니다 (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 인 것 같습니다
Lui

6
난 그냥 생각 : WTF, 그리고 주말이야!
agtoever

STFU! 오, 그건 작동하지 않습니다 ... : D
flawr

답변:


6

망막 , 152 88

@ Martin 's 및 @randomra의 도움으로 대규모 골프를 즐기십시오! 둘 다 고마워!

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

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

온라인으로 사용해보십시오. 두 줄 m`은이 온라인 통역사 링크로 시작 합니다. 따라서 프로그램은 여러 입력 라인과 함께 작동하므로 모든 테스트를 한 번에 수행 할 수 있습니다. 그러나 여러 입력 줄이 필요하지 않으므로 위 또는 내 점수에 포함되지 않습니다.


1
Dang, 나는 마침내 당신의 152 아래로 광산을 when 때 흥분했다. 지금 이길 수 없어 XD 아주 좋은 놈 =)
Mwr247

T`l``Su\B|\BSa|.*e.*|uTh|o|r3 바이트를 더 절약합니다.
randomra

5

자바 스크립트 (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)

정규식 테스트는 특별한 날 규칙을 신속하게 수행하는 데 도움이되었으며 이상적이지는 않지만 객체 맵이 작동합니다. 그래도 몇 가지를 더 짜낼 수 있다고 확신합니다.


2

파이썬 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']

이데온 테스트


당신은 그것을 (정말로) 하나의 라이너로 만들었습니다!
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.