Sfida
Trova il regex più breve che
- convalida, ad esempio le corrispondenze, tutte le possibili date nel calendario prololico gregoriano (che si applica anche a tutte le date prima della sua prima adozione nel 1582) e
- non corrisponde a nessuna data non valida.
Produzione
L'output è quindi verità o falsità.
Ingresso
L'input è in uno dei 3 formati di data ISO 8601 espansi - nessuna volta.
I primi due sono ±YYYY-MM-DD
(anno, mese, giorno) e ±YYYY-DDD
(anno, giorno). Entrambi hanno bisogno di un involucro speciale per il giorno bisestile. Sono ingenuamente abbinati separatamente da questi RX estesi:
(?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d)
(?<year>[+-]?\d{4,})-(?<doy>\d{3})
Il terzo formato di input è ±YYYY-wWW-D
(anno, settimana, giorno). È complicato a causa del complesso schema delle settimane bisestili.
(?<year>-?\d{4,})-W(?<week>\d\d)-(?<dow>\d)
Un controllo di validità di base, ma insufficiente per tutte e tre le combinazioni sarebbe simile a questo:
[+-]?\d{4,}-((0\d|1[0-2])-([0-2]\d|3[01]) ↩
|([0-2]\d\d|3[0-5]\d|36[0-6]) ↩
|(W([0-4]\d|5[0-3])-[1-7]))
condizioni
Un anno bisestile nel calendario prololico gregoriano contiene il giorno bisestile …-02-29
e quindi dura 366 giorni, quindi …-366
esiste. Ciò accade in qualsiasi anno il cui numero ordinale è divisibile per 4, ma non per 100 a meno che non sia anche divisibile per 400. L'
anno zero esiste in questo calendario ed è un anno bisestile.
Un lungo anno nel calendario delle settimane ISO contiene una 53a settimana, che si potrebbe definire una " settimana bisestile ". Ciò accade in tutti gli anni in cui il 1 ° gennaio è un giovedì e in tutti gli anni bisestili in cui è un mercoledì. Si presenta di solito ogni 5 o 6 anni, in uno schema apparentemente irregolare.
Un anno ha almeno 4 cifre. Non è necessario sostenere anni con più di 10 cifre, perché è abbastanza vicino all'età dell'universo (circa 14 miliardi di anni). Il segno più iniziale è facoltativo, sebbene lo standard attuale suggerisca che dovrebbe essere richiesto per anni con più di 4 cifre.
Non è possibile accettare date parziali o troncate, ovvero con precisione inferiore a quella giornaliera.
Le parti della notazione della data, ad esempio il mese, non devono essere abbinate da un gruppo a cui potrebbe essere fatto riferimento.
Regole
Questo è code-golf. Vince la regex più corta senza codice eseguito. Aggiornamento: è possibile utilizzare funzioni come ricorsione e gruppi bilanciati, ma verrà multato di un fattore 10, con il quale il numero di personaggi viene quindi moltiplicato! Questo è ora diverso dalle regole del golf Hard code: Regex per divisibilità per 7 . La risposta precedente vince un pareggio.
Casi test
Test validi
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
200000-02-29
2016-366
2000-366
0000-366
-2016-366
-2000-366
2015-081
2015-W33-1
2015-W53-7
2015-08-10
L'ultimo è facoltativamente valido, vale a dire che possono essere tagliati spazi iniziali e finali nelle stringhe di input.
Formati non validi
-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
Date non valide
2015 # a valid ISO format, but we require day-precision
2015-08 # 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