Thử thách
Tìm regex ngắn nhất mà
- xác nhận, tức là khớp, mọi ngày có thể trong lịch Proleptic Gregorian (cũng áp dụng cho tất cả các ngày trước khi áp dụng lần đầu tiên vào năm 1582) và
- không khớp với bất kỳ ngày không hợp lệ.
Đầu ra
Do đó đầu ra là trung thực hoặc falsey.
Đầu vào
Đầu vào là bất kỳ trong 3 định dạng ngày ISO 8601 mở rộng - không có lần.
Hai cái đầu tiên là ±YYYY-MM-DD
(năm, tháng, ngày) và ±YYYY-DDD
(năm, ngày). Cả hai đều cần vỏ đặc biệt cho ngày nhuận. Chúng được kết hợp một cách ngây thơ bởi các RX mở rộng này:
(?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d)
(?<year>[+-]?\d{4,})-(?<doy>\d{3})
Định dạng đầu vào thứ ba là ±YYYY-wWW-D
(năm, tuần, ngày). Đây là một trong những phức tạp vì mô hình tuần nhuận phức tạp.
(?<year>-?\d{4,})-W(?<week>\d\d)-(?<dow>\d)
Một kiểm tra tính hợp lệ cơ bản, nhưng không đủ cho cả ba kết hợp sẽ trông giống như thế này:
[+-]?\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]))
Điều kiện
Một năm nhuận trong lịch Gregorian Proleptic chứa ngày nhuận …-02-29
và do đó nó dài 365 ngày, do đó …-366
tồn tại. Điều này xảy ra trong bất kỳ năm nào có số thứ tự chia hết cho 4, nhưng không phải là 100 trừ khi nó cũng chia hết cho 400.
Năm không tồn tại trong lịch này và đó là một năm nhuận.
Một năm dài trong lịch tuần ISO có tuần thứ 53, trong đó người ta có thể gọi là tuần nhuận nhuận . Điều này xảy ra trong tất cả các năm trong đó ngày 1 tháng 1 là thứ năm và thêm vào đó là tất cả các năm nhuận trong đó là thứ tư. Nó thường xảy ra cứ sau 5 hoặc 6 năm, theo một mô hình dường như không đều.
Một năm có ít nhất 4 chữ số. Không cần phải hỗ trợ nhiều năm với hơn 10 chữ số, vì nó đủ gần với tuổi của vũ trụ (khoảng 14 tỷ năm). Dấu cộng hàng đầu là tùy chọn, mặc dù tiêu chuẩn thực tế cho thấy nó cần được yêu cầu trong nhiều năm với hơn 4 chữ số.
Ngày một phần hoặc cắt ngắn, tức là với độ chính xác thấp hơn ngày, không được chấp nhận.
Các phần của ký hiệu ngày, ví dụ như tháng, không phải khớp với một nhóm có thể được tham chiếu.
Quy tắc
Đây là mã golf. Regex ngắn nhất mà không có mã thực thi sẽ thắng. Cập nhật: Bạn có thể sử dụng các tính năng như đệ quy và các nhóm cân bằng, nhưng sẽ bị phạt theo hệ số 10, số lượng ký tự sau đó được nhân với! Điều này bây giờ khác với các quy tắc trong Hard code golf: Regex cho phép chia hết cho 7 . Câu trả lời trước đó thắng một tie.
Các trường hợp thử nghiệm
Kiểm tra hợp lệ
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
Cái cuối cùng là hợp lệ tùy chọn, tức là khoảng trắng ở đầu và cuối trong chuỗi đầu vào có thể được cắt bớt.
Định dạng không hợp lệ
-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
Ngày không hợp lệ
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