1
在验证ISO 8601日期时击败纯正则表达式
在RX的ValiDate ISO 8601中,挑战在于仅使用标准正则表达式来验证标准日期格式和值(前者是RX的常见工作,后者是不寻常的)。获奖答案使用了778个字节。这个挑战是要使用您选择的任何语言来克服这种挑战,但要使用特殊的日期函数或类。 挑战 查找最短的代码 验证Proleptic Gregorian日历中的每个可能日期(也适用于1582年首次采用之前的所有日期), 与任何无效的日期都不匹配,并且 不使用任何预定义的函数,方法,类,模块或类似方法来处理日期(和时间),即依赖于字符串和数字运算。 输出量 输出是真还是假。无需输出或转换日期。 输入值 输入是3种扩展的ISO 8601日期格式中的任何一种的单个字符串-无时间。 前两个是±YYYY-MM-DD(年,月,日)和±YYYY-DDD(年,日)。两者都需要special日的特殊保护套。这些扩展的RX天真地将它们分别匹配: (?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d) (?<year>[+-]?\d{4,})-(?<doy>\d{3}) 第三种输入格式是±YYYY-wWW-D(年,周,日)。由于leap周模式复杂,因此比较复杂。 (?<year>[+-]?\d{4,})-W(?<week>\d\d)-(?<dow>\d) 条件 一个闰年的Proleptic公历包含闰日 …-02-29,因此它是长366天,因此…-366存在。这种情况发生在序数可以被4整除但不能被100整除(除非也可以被400除)的任何 年份。此日历中存在零年,并且是a年。 一个漫长的一年,在ISO周历包含了第53周…-W53-…,其中一个可以称之为一个“ 闰周 ”。在1月1日是星期四的所有年份中都会发生这种情况,在所有leap年都是星期三的所有leap年都发生这种情况。0001-01-01并且2001-01-01是星期一。事实证明,这种情况通常每5或6年出现一次,看似不规则。 一年至少有4位数字。不必支持位数超过10的年份,因为这已经足够接近宇宙的年龄(约140亿年)。前导加号是可选的,尽管实际标准建议多于4位数字的年份需要使用它。 不得接受不完整的部分或截短日期。-在所有情况下都必须使用连字符。(这些先决条件可以使导致+总是可选的。) 规则 这是代码高尔夫球。以字节为单位的最短代码获胜。较早的答案胜出。 测试用例 有效测试 2015-08-10 2015-10-08 12015-08-10 -2015-08-10 +2015-08-10 0015-08-10 1582-10-10 2015-02-28 2016-02-29 2000-02-29 0000-02-29 -2000-02-29 -2016-02-29 +2016-02-29 200000-02-29 -200000-02-29 +200000-02-29 2016-366 …