一周中压缩的天数


18

输入星期几列表,则输出列表中最短的排序表示形式。

输入的格式是由一个或多个双字符子串的字符串Su(星期日), Mo(星期一), Tu(等), ,WeThFrSa。输入不一定必须以排序的顺序给出。

要将输入转换为输出格式,

  • 从星期天开始按星期几对输入进行排序(例如ThMoSaSuFrTuWe-> SuMoTuWeThFrSa)。

  • 如果不引起歧义,请将缩写词减少到一个字母。例如,之所以SuMoTuWe成为,SMTW是因为第一个S不可能在星期六,因为这样会使输出未排序(与T相同)。但是,ThFrSa应该成为ThFS,因为星期二和星期四都在星期五之前,并将其减小以TFS产生歧义。

  • 如果输出为now MTWTF,则D改为输出(代表“ 工作日 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
Lui

6
我只是在想:WTF,现在是周末!
2016年

STFU!哦,那行不通...:D
瑕疵的

Answers:


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

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

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

测试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.