В ValiDate ISO 8601 от RX задача состояла в том, чтобы использовать только стандартные регулярные выражения для проверки стандартных форматов и значений даты (первое - обычное задание для RX, второе - необычно). Победивший ответ использовал 778 байтов. Эта задача состоит в том, чтобы победить это, используя любой язык по вашему выбору, но без специальных функций даты или классов .
Вызов
Найдите самый короткий код, который
- проверяет каждую возможную дату в григорианском календаре Proleptic (которая также применяется ко всем датам до его первого принятия в 1582 году),
- не соответствует ни одной недействительной дате и
- не использует предопределенные функции, методы, классы, модули или аналогичные для обработки дат (и времени), т.е. полагается на строковые и числовые операции.
Выход
Вывод правдивый или ложный. Нет необходимости выводить или преобразовывать дату.
вход
Ввод - одна строка в любом из 3 расширенных форматов даты ISO 8601 - без раз.
Первые два ±YYYY-MM-DD
(год, месяц, день) и ±YYYY-DDD
(год, день). Оба нуждаются в специальном корпусе для високосного дня. Они наивно сопоставляются отдельно этими расширенными RX:
(?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d)
(?<year>[+-]?\d{4,})-(?<doy>\d{3})
Третий формат ввода ±YYYY-wWW-D
(год, неделя, день). Это сложный из-за сложной модели високосной недели.
(?<year>[+-]?\d{4,})-W(?<week>\d\d)-(?<dow>\d)
условия
Високосный год в календаре преждевренного григорианскому содержит високосный день …-02-29
и , таким образом , он долго 366 дней, следовательно , …-366
существует. Это происходит в любом году, чье (возможно, отрицательное) порядковое число делится на 4, но не на 100, если оно также не делится на 400.
В этом календаре существует нулевой год, и это високосный год.
Долгий год в недельном календаре ISO содержит 53 - ю неделю …-W53-…
, что один может срок на « прыжок неделю ». Это происходит во все годы, когда 1 января - четверг, и дополнительно во все високосные годы, когда это среда. 0001-01-01
и 2001-01-01
понедельники. Оказывается, это происходит каждые 5 или 6 лет обычно, по-видимому, нерегулярно.
Год имеет как минимум 4 цифры. Не нужно поддерживать годы с более чем 10 цифрами, потому что это достаточно близко к возрасту вселенной (около 14 миллиардов лет). Знак «плюс» необязателен, хотя действительный стандарт предполагает, что он должен быть обязательным для годов с более чем 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
2000-366
0000-366
-2000-366
-2016-366
+2016-366
2015-081
2015-W33-1
2015-W53-7
+2015-W53-7
+2015-W33-1
-2015-W33-1
2015-08-10
Последний является необязательным, то есть начальные и конечные пробелы во входных строках могут быть обрезаны.
Неверные форматы
-0000-08-10 # that's an arbitrary decision
15-08-10 # year is at least 4 digits long
2015-8-10 # month (and day) is exactly two digits long, i.e. leading zero is required
015-08-10 # year is at least 4 digits long
20150810 # though a valid ISO format, we require separators; could also be interpreted as a 8-digit year
2015 08 10 # separator must be hyphen-minus
2015.08.10 # separator must be hyphen-minus
2015–08–10 # separator must be hyphen-minus
2015-0810
201508-10 # could be October in the year 201508
2015 - 08 - 10 # no internal spaces allowed
2015-w33-1 # letter ‘W’ must be uppercase
2015W33-1 # it would be unambiguous to omit the separator in front of a letter, but not in the standard
2015W331 # though a valid ISO format we require separators
2015-W331
2015-W33 # a valid ISO date, but we require day-precision
2015W33 # though a valid ISO format we require separators and day-precision
2015-08 # a valid ISO format, but we require day-precision
201508 # a valid but ambiguous ISO format
2015 # a valid ISO format, but we require day-precision
Неверные даты
2015-00-10 # month range is 1–12
2015-13-10 # month range is 1–12
2015-08-00 # day range is 1–28 through 31
2015-08-32 # max. day range is 1–31
2015-04-31 # day range for April is 1–30
2015-02-30 # day range for February is 1–28 or 29
2015-02-29 # day range for common February is 1–28
2100-02-29 # most century years are non-leap
-2100-02-29 # most century years are non-leap
2015-000 # day range is 1–365 or 366
2015-366 # day range is 1–365 in common years
2016-367 # day range is 1–366 in leap years
2100-366 # most century years are non-leap
-2100-366 # most century years are non-leap
2015-W00-1 # week range is 1–52 or 53
2015-W54-1 # week range is 1–53 in long years
2016-W53-1 # week range is 1–52 in short years
2015-W33-0 # day range is 1–7
2015-W33-8 # day range is 1–7
-0000-08-10
чем именно произвольное решение? Не допускаете год как отрицательный 0?
+0000-08-10
и 0000-08-10
должен использоваться вместо этого. Тем не менее, обратите внимание, что принятый ответ в варианте регулярного выражения этой задачи не проходит этот конкретный тестовый пример, так что это на самом деле не сбойное условие (т. Е. Должно , а не обязательно ).