圧縮された曜日


18

曜日のリストの入力が与えられると、リストの最短のソートされた表現を出力します。

入力の形式は、2文字のストリングの一つ以上からなる文字列であるSu(日)、 Mo(月)、 Tu(など)、 、WeThFrおよびSa。入力は必ずしもソートされた順序で与えられるとは限りません。

入力を出力形式に変換するには、

  • 入力を日曜日から始まる曜日で並べ替えます(例ThMoSaSuFrTuWe-> SuMoTuWeThFrSa)。

  • あいまいさを残さない場合は、略語を1文字に減らします。たとえば、最初のSが土曜日になることができなかったため、にSuMoTuWeなるはずSMTWです。これにより、出力がソートされなくなります(Tと同じ)。しかし、ThFrSaなるはずThFS火曜日と木曜日の両方が金曜日前にそれを減らしてくると、TFSあいまいさを作成します。

  • 出力がnowの場合、代わりMTWTFに出力D(「week day s」を表します)。同様に、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、そして週末だ!
-agtoever

STFU!ああ、それは機能しません...:D
flawr

回答:


6

網膜152 88

@Martinと@randomraの助けを借りて大量にゴルフをしました!二人ともありがとう!

^
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)

正規表現テストは、特別な日のルールの迅速な作業を支援し、理想的ではありませんが、オブジェクトマップはそれを機能します。ただし、これをさらに絞り込めることは確かです。


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

イデオンでテストする


あなたはそれを(本当に長い)ワンライナーにしました!
-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.