1
ISO 8601日付の検証で純粋な正規表現を破る
ではRXによって検証ISO 8601、挑戦はするだけで、標準的な正規表現を使用していた標準の日付形式検証と値を(前者はRXのための共通の仕事で、後者は異例でした)。勝った答えは778バイトを使用しました。この課題は、特別な日付関数またはクラスを使用せずに、選択した任意の言語を使用してそれを克服することです。 チャレンジ 最短のコードを見つける Proleptic Gregorianカレンダーのすべての可能な日付を検証します(これは1582年に最初に採用される前のすべての日付にも適用されます)。 無効な日付と一致しない 事前に定義された関数、メソッド、クラス、モジュールなどを使用して日付(および時刻)を処理しません。つまり、文字列および数値演算に依存します。 出力 出力は真実または偽です。日付を出力または変換する必要はありません。 入力 入力は、3つの拡張ISO 8601日付形式のいずれかの単一文字列です。 最初の2つは±YYYY-MM-DD(年、月、日)と±YYYY-DDD(年、日)です。両方ともうるう日に特別なケーシングが必要です。これらは、これらの拡張RXによって個別に単純に照合されます。 (?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d) (?<year>[+-]?\d{4,})-(?<doy>\d{3}) 3番目の入力形式は±YYYY-wWW-D(年、週、日)です。複雑なうるう週パターンのため、複雑なものです。 (?<year>[+-]?\d{4,})-W(?<week>\d\d)-(?<dow>\d) 条件 うるう年予期的グレゴリオ暦のカレンダーでは、含まれているうるう日 …-02-29、したがって、それは長い366日で、それ故に…-366存在します。これは、(おそらく負の)序数が4で割り切れる年に発生しますが、400で割り切れる場合を除き、100で割り切れません。 このカレンダーにはゼロ年が存在し、うるう年です。 長い年のISO週のカレンダーでは、第53週が含ま…-W53-…1は「という用語ができ、飛躍の週を」。これは、1月1日が木曜日であるすべての年に発生し、さらに水曜日であるすべてのうるう年に発生します。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 2000-366 0000-366 -2000-366 …