阅读我的自由格式日期


10

给定以以下任何格式(必须在同一程序中全部处理)编写的日期,请将其解析为有效的yyyy/mm/dd date

17th May 2012
March 14th, 2016
20 February 2014
September 14, 2017
Sunday, June 8, 2015

规则

  • 日期有时是无效的,即。如果月份中的日期不正确或一年中的月份数不正确,则必须处理两种情况。您可以选择是否出错或返回一致的false值。(但是,它们将遵循上面的模板格式)
  • 必须使用少于10天和几个月的填充来创建两位数的输出。
  • 月名称将始终为全名,而不是三个字符的缩写。
  • 您可以假设年份始终在0000-9999之间。
  • 负数无需处理。
  • 您可以创建完整的程序或函数,以便输出可以是任何格式,可以打印到控制台或可以从函数返回。
  • 输入将始终是一个字符串,输出必须始终是一个字符串,如果这使得将其作为数组中的单个参数变得更短,例如。["17th May 2012"]您可以这样做,并且输出可以相同["2012/05/17"]
  • 您可以假设输入中的拼写正确。

奖励:这里不喜欢挑战的cos;)

如果你能设法还允许的输入格式,The Fourteenth of March, 2016或者March the Fourteenth, 2016你可能需要一个额外的20个字节关闭您的代码与任何最终的字节数小于1,导致1。

这是每一天的完整书面数字,以免造成拼写混乱。

First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Nineth, Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth, Twentieth, Twenty First, Twenty Second, Twenty Third, Twenty Fourth, Twenty Fifth, Twenty Sixth, Twenty Seventh, Twenty Eighth, Twenty Nineth, Thirtieth, Thirty First

测试用例

INPUT                           | Output
17th May 2012                   | 2012/05/17
March 14th, 2016                | 2016/03/14
20 February 2014                | 2014/02/20
September 14, 2017              | 2017/09/14
Sunday, June 8, 2015            | 2015/06/08
1st January 1918                | 1918/01/01

The Fourteenth of March, 2016   | 2016/03/14
March the Fourteenth, 2016      | 2016/03/14
November the Seventeenth, 2019  | 2019/11/17
The Thirtieth of April, 2016    | 2016/04/30

30 February 2014                | Invalid
September 99, 2017              | Invalid
Sunday, June8, 2015             | Invalid

The Thirty First of April, 2016 | Invalid


10
这里的cos谁不喜欢挑战 ”-当他们以奖金的形式出现时,我们大多数人都不喜欢!并输入验证码。
毛茸茸的

3
@ Mr.Xcoder我觉得整个挑战是支持多种格式信号输入..之类的东西20 February 2014都默认了很多日期解析器的支持,但17thSunday, June 8, 2015是有点困难解析(取决于语言)。
凯文·克鲁伊森

1
@ Mr.Xcoder我从未说过这是一个有趣/无聊,容易/困难,好/坏的代码高尔夫挑战。我只是说,根据我在挑战中所读内容,支持多种输入格式似乎是挑战的主要目标。我同意这很可能是五个输入格式的if-else,或者是提取年,月和日的某种正则表达式(这是我目前的做法)。
凯文·克鲁伊森

3
星期几总是正确的吗?会Thursday, August 25, 2017有效吗?我看到提交的文章忽略了DOW。
本杰明·坎宁安

Answers:


4

轨,4137 35个字节

->x{x.to_date.strftime('%Y/%m/%d')}

我不知道Rails的在线解释器,但是下面的屏幕快照演示了此过程

在此处输入图片说明


在线口译链接?
乔纳森·艾伦

1
这真的适用于所有相关格式吗?:o
totallyhuman

@totallyhuman添加了显示结果的屏幕截图。不幸的是,我不知道在线口译员:(
Suever

8

PowerShell91 89 91 56字节

date("$args"-replace'th|rd|st|(\b.*)day|,')-f yyyy/MM/dd

在线尝试!

将输入作为字符串。使用a -replace消除垃圾,然后使用Get-Date带有-format标志的内置命令来指定所需的yyyy/MM/dd格式。该字符串保留在管道上,并且输出是隐式的。

多亏了Xcoder先生,节省了两个字节。得益于TessellatingHeckler的正则表达式高尔夫,节省了一大笔钱。


1
嘿,看起来很有竞争力的PowerShell提交!
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer日期操作是PowerShell的优势之一。
AdmBorkBork


@ Mr.Xcoder“所有这些” = 2。谢谢!
AdmBorkBork

您可以''从日期格式中删除-2。如果您要坚持自己的方法,则在“拼写正确”的情况下,您可以替换'th|rd|st|(\b.*)day|,'它,并将其减少到56个字节并处理相同的情况。尽管我认为这是错误的,因为如果您放弃这些日子,您将无法受理 Sunday, June8, 2015 | Invalid此案,因为那是星期一。它应该出错,但解析为有效。不知道该裁定是什么,还是不确定其他人是否正在检查它。
TessellatingHeckler

4

PHP,73 164 + 1个字节

for(preg_match("#(\d+)[^\d]+(\d+)#",$d=$argn,$r);$m++<12;)strpos(_.$d,date(F,strtotime($r[2].-$m)))&&printf(checkdate($m,$r[1],$r[2])?"$r[2]/%02d/%02d":E,$m,$r[1]);

与管道一起运行-nR在线尝试

日期检查确实非常昂贵:我必须在使用内置函数之前分解日期,然后尝试输入月份名称并输入错误。


我认为您必须支持所有格式,而不仅仅是其中一种?
暴民埃里克(Erik the Outgolfer)'17年

1
@EriktheOutgolfer做到了。但不是奖金格式。
泰特斯(Titus),

@EriktheOutgolfer这确实处理所有格式。
Xcoder先生17年

1
对于无效日期,此操作将失败。30 February 2014返回2014/03/02您可以选择是否出错或返回一致的false值。(不过,他们将
遵循

@ Mr.Xcoder完全毁了它
Titus

3

蟒3 + parsedatetime库,152个 139 155 153字节

由于乔纳森·艾伦节省了13个字节

添加了16个字节来处理长度天数无效的日期

通过删除lambda分配节省了2个字节

lambda s:re.search(f'(^| ){str(h(s)[0].tm_mday)[:2]}[^\d]',s)and time.strftime('%Y/%m/%d',h(s)[0])
import parsedatetime as p,time,re
h=p.Calendar().parse

在线尝试!

不支持奖励日期


欢迎来到PPCG!不错的第一篇文章。使用以下方法节省13个字节:false的返回值Noneimport ...as; &a lambda重用parseh
乔纳森·艾伦


1

Java(OpenJDK 8),190 + 26 = 216字节

import java.time.format.*;

s->DateTimeFormatter.ofPattern("uuuu/MM/dd").format(DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu").withResolverStyle(ResolverStyle.STRICT).parse(s.replaceAll("(\\d)[a-z].","$1")))

在线尝试!

重要提示:这是也验证星期,而不是抛弃它,使验证包括!

SimpleDateFormat除了所有公认的日期(如2月30日)以外,我还没有尝试过其他明显的案例。因此,我不得不放弃它,并使用了Java 8 DateTimeFormatter

说明

"[EEEE, ][d ]MMMM [d, ]uuuu"

此格式表示:

  • 可选的星期几,后跟逗号和空格[EEEE, ](在中出现Sunday, ...),
  • 其次是带空格的可选日期[d ]
  • 其次是全字母MMMM和空格的月份,
  • 然后是可选的日期,并以逗号和空格表示[d, ]
  • 接下来是年份,uuuu以使解析器知道我们处于格里高利时代。

码:

import java.time.format.*;                                     // Required for DateTimeFormatter, *and* ResolverStyle

s->DateTimeFormatter.ofPattern("uuuu/MM/dd")                   // Output format
  .format(
    DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu")  // Input format
      .withResolverStyle(ResolverStyle.STRICT)                 // Invalidates xxxx-02-30 instead of transforming it into xxxx-02-28
      .parse(
        s.replaceAll("(\\d)[a-z].","$1")                       // remove st, nd, rd, th
       )
    )

学分

  • 感谢Neil,正则表达式中有2个字节。

1
您是否需要replaceAll图案中的括号?
尼尔

好像我不知道。谢谢,@尼尔!
奥利维尔·格雷戈尔(OlivierGrégoire),

1

的JavaScript(ES6),124个 122字节

f=
s=>(d=new Date(s.replace(/.[dht]\b/,'')+' +0')).getDate()==s.match(/\d\d?/)&&d.toISOString().replace(/-(..)(T.*)?/g,'/$1')
<input oninput=o.textContent=f(this.value)><pre id=o>


返回2015/06/07June 8, 2015(UTC问题?我在UTC + 2),false对于任一Sunday, June 8, 2015Monday, June 8, 2015
奥利维尔·格雷戈尔

1
@OlivierGrégoire感谢您指出这些问题。我只在夏令时以外的英国尝试过约会,所以他们已经在使用UTC了,而我没有尝试过以结尾的工作日nday
尼尔
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.