这个日期格式是什么?


11

对于公历,日期格式因国家/地区而异。公认的三种主要格式:

  1. YY-MM-DD (大端)
  2. DD-MM-YY (小尾数)
  3. MM-DD-YY (中端)

您的任务是编写一个程序,给定一个表示日期的输入字符串,该程序输出所有可能的日期格式,以此字符串可以将其解释为日期。

规则

  • 输入日期的格式为xx-xx-xx,其中每个字段均为两位数字,且填充零。
  • 该日期始终有效(因此您无法获得14-13-17之类的信息)
  • 日期始终至少是上述格式之一(因此您无法获得17-14-11之类的信息)
  • 因为实际上我们处于并行世界中,所以每年的每个月都有31天,因此没有leap年
  • 日期为2001年1月1日至2099年12月31日之间
  • 如果日期只有一种格式,则代码必须仅打印该日期(仅允许尾随换行符)
  • 如果日期有多种格式,则必须用逗号,空格,换行符或它们的组合分隔
  • 您必须输出格式的确切名称。不允许使用不同的任意值。
  • 除尾随空格外,不允许任何前导或尾随字符
  • 输出必须为小写
  • 不允许使用任何内置的日期或日历功能
  • 输出格式不必排序

例子

Input      Output
30-05-17   big-endian, little-endian
05-15-11   middle-endian
99-01-02   big-endian
12-11-31   big-endian, little-endian, middle-endian
02-31-33   middle-endian

这是因此以字节为单位的最短代码获胜。鼓励解释。


3
您可能应该使用2月31日添加一个测试用例,以确保答案支持该怪异的情况:P
ETHproductions's

我们可以为三种有效格式输出任何三个不同的值,还是必须是这三个确切的字符串?
ETHproductions's

3
there are 31 days for every month of the year, and consequently no leap years那么,这意味着任何日期库实际上都对此没有用吗?
TheLethalCoder

1
@TheLethalCoder是的,大多数日期库可能无法使用。
吉姆(Jim)

1
还有更多的格式
ugoren

Answers:


3

05AB1E,40个字节

'-¡©2£13‹`®Á2£32‹*)˜“Œ±„¥„ê“#Ï’-„–ian’«»

在线尝试!

说明

'-¡©                                      # split on "-" and store a copy in register
    2£13‹                                 # compare the first 2 elements to 13
         `                                # split as separate to stack
                                          # the bottom element is true if it is middle endian
                                          # the top value is true if it can be big/little
          ®Á                              # retrieve the list from register and rotate right
            2£32‹                         # compare the first 2 elements to 32
                 *                        # multiply with the result of the comparison to 13
                  )˜                      # wrap in a flattened list
                    “Œ±„¥„ê“#             # push the list ['middle', 'big', 'little']
                             Ï            # index into this with the flattened list
                                          # this leaves the types the date could be
                              ’-„–ian’«   # append "-endian" to each
                                       »  # join on newlines

4

Python 2,123字节

a,b,c=map(int,input().split('-'))
for a,b,c in[[b,c,'big'],[b,a,'little'],[a,b,'middle']]:print(c+'-endian')*(a<13)*(b<32),

在线尝试!


Python 2,更少的输入解析,123字节

d=input()
for a,b,c in[[3,6,'big'],[3,0,'little'],[0,3,'middle']]:print(c+'-endian')*(int(d[a:a+2])<13)*(int(d[b:b+2])<32),

在线尝试!


您可以使用换行符分隔,因此可以删除结尾的,
乔纳森·艾伦

4

的JavaScript(ES6),121个 119 118 112字节

返回以空格分隔的字符串,并带有尾随空格。

s=>['big','little','middle'].map((v,i)=>[b<13&c<32,b<13&a<32,a<13][i]?v+'-endian ':'',[a,b,c]=s.split`-`).join``

怎么样?

我们将输入分为abc。因为保证日期是有效的,所以我们肯定知道b小于32。因此,足以测试a是否小于13来验证中间字节序格式。Little-endian和big-endian格式要求b小于13,并且分别对ac进行另一个测试以验证日期。

因此,这3个测试:

  • 大端:b <13&c <32
  • 小端:b <13&a <32
  • 中端:a <13

测试用例


3

击,240个 125 116 112字节

IFS=- read a b c<<<$1
d=-endian
((b<13))&&(((a<32))&&echo little$d;((c<32))&&echo big$d);((a<13))&&echo middle$d

打高尔夫球。

感谢manatwork的一些提示

保存了9个字节,删除了中端以下跟随的Arnauld答案中少于32个的验证

通过使用不同的变量而不是数组节省了4个字节

测试一下!



谢谢@manatwork我有一个标记为问题的问题非常有用,会打高尔夫球

1

C#,180个字节

t=(n,m)=>int.Parse(n)<13&int.Parse(m)<32;s=>{var a=s.Split('-');return$"{(t(a[1],a[2])?"big-endian":"")} {(t(a[1],a[0])?"little-endian":"")} {(t(a[0],a[1])?"middle-endian":"")}";};

仅具有空格分隔值的输出也可以具有前导和尾随空格。如果需要,在OP对此进行了澄清后将进行更新。

完整/格式化版本:

Func<string, string, bool> t = (n, m) => int.Parse(n) < 13 & int.Parse(m) < 32;

Func<string, string> f = s =>
{
    var a = s.Split('-');

    return $"{(t(a[1], a[2]) ? "big-endian" : "")} {(t(a[1], a[0]) ? "little-endian" : "")} {(t(a[0], a[1]) ? "middle-endian" : "")}";
};

我把规则更明确了:No leading or trailing characters others than a trailing space are allowed
吉姆(Jim)

1

PHP,151字节

[$a,$b,$c]=sscanf($argn,"%d-%d-%d");$z="-endian ";echo($m=$b&&$b<13)&&$c&&$c<32?big.$z:"",$m&&$a&&$a<32?little.$z:"",$a&&$a<13&&$b&&$b<32?middle.$z:"";

测试用例


1

批处理,138个字节

@echo off
set/ps=
call:l little %s:-= %
exit/b
:l
call:e big %4 %3
call:e middle %3 %2
:e
if %2 leq 31 if %3 leq 12 echo %1-endian

模糊地基于@ovs的答案。


1

Java 232字节

(String s)=>{String[]i=s.split("-");String e="-endian",b="big"+e,m="middle"+e,l="little"+e;int p=Integer.valueOf(i[0]);System.out.print(p<13?Integer.valueOf(i[1])<13?Integer.valueOf(i[2])<32?b+","+m+","+l:m+","+l:m:p<32?b+","+l:b);}

这是一个更好的版本

String[] i = s.split("-");

String e = "-endian",
       b = "big" + e,
       m = "middle" + e,
       l = "little" + e;

int p = Integer.valueOf(i[0]);

我真的不知道该如何格式化这部分...

System.out.print(
        p < 13 ? Integer.valueOf(I[1]) < 13 ? Integer.valueOf(I[2]) < 32 ? b + "," + m + "," + l
                                                                         : m + "," + l
                                            : m 

               : p < 32 ? b + "," + l 
                        : b
);

1
尾位太多:String e="-endian",b="big"+e,m="middle"+e,l="little"+e;
manatwork '17

好一点,当我决定不这样做时,我在字节数中包括了一个额外的“ String”。@manatwork
cheemcheem

1

PHP,131字节

[$a,$b,$c]=explode('-',$argn);foreach([[big,b,c],[little,b,a],[middle,a,b]]as[$t,$x,$y])echo$$x*$$y&&$$x<13&$$y<32?"$t-endian ":"";
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.