Tôi là một người du hành thời gian và tôi bị ám ảnh bởi dòng thời gian. Tôi đặc biệt yêu thích những khoảnh khắc khi kim đồng hồ trôi qua 12 hoặc khi tôi lật sang trang tiếp theo của lịch hoặc khi mọi người hét lên "Chúc mừng năm mới!"
Xin vui lòng viết cho tôi một chương trình để cho tôi thấy tôi còn bao xa từ giây phút cuối cùng đến lần tiếp theo, dưới dạng một thanh tiến trình. Ví dụ, nếu tôi nói với nó thời gian là 09:12, thì nó nên in cái này:
09:00 ####---------------- 10:00
Nếu tôi nói với nó là tháng 5 năm 1982 thì nên in nó:
1982-01 #######------------- 1983-01
Tôi đã đề cập tôi là một người du hành thời gian? Tôi đi đến bất cứ nơi nào từ mili giây đầu tiên của 0 AD đến mili giây cuối cùng của 9999 AD, vì vậy chương trình cần xử lý bất kỳ ngày và giờ nào trong phạm vi đó.
Đầu vào
Đầu vào sẽ ở một trong các định dạng sau:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
Đây là những định dạng duy nhất cần được xử lý. Mỗi phần sẽ có chính xác số chữ số được hiển thị, có nghĩa là giây phân số có thể có các số 0 ở cuối (ví dụ:
.120
không bao giờ.12
). ĐâyT
là một chữ cái "T" phân định ngày từ thời gian. Giờ là trên đồng hồ 24 giờ.Tháng và ngày là 1 dựa trên (nhiều hơn về điều này dưới đây).
Đầu vào không hợp lệ và ngoài phạm vi không cần phải xử lý.
Theo quyết định của lập trình viên, đầu vào có thể có một dòng mới duy nhất.
Tiến trình toán thanh
Chương trình liên quan đến các đơn vị ít quan trọng nhất và ít quan trọng thứ hai trong đầu vào nhất định. Ví dụ: nếu đầu vào có độ chính xác cấp ngày (ví dụ 2016-12-14
), thanh tiến trình sẽ cho biết tỷ lệ các ngày trong tháng đầu vào đã trôi qua so với những gì còn lại.
Thanh tiến trình sẽ có 20 đơn vị (ký tự) và tỷ lệ đại diện sẽ được làm tròn đến thặng dư vực gần 1 / 20 . Ví dụ, cho 2016-12-14T12:28
, thanh tiến trình sẽ hiển thị vòng ( 28 / 60 × 20) = 9 của 20 đơn vị "điền".
1 tháng dựa trên ngày
Mặc dù ngày 1 tháng 12 (ví dụ) là 01
vào 2016-12-01
, với mục đích tính toán, đó là ngày thứ 0 của tháng, bởi vì các đơn vị rút gọn ngụ ý 0 mili giây của phút thứ 0 của giờ thứ 0 trong ngày. Nói cách khác, 2016-12-01
là 0 ⁄ 31 trong suốt tháng 12 và 2016-12-02
là 1 ⁄ 31 , v.v.
Tương tự như vậy, 2016-01
là millisecond 0 của ngày 0 tháng Giêng, vì vậy trong tính toán của nó là 0 / 12 , mà phương tiện 2016-12
là 11 / 12 .
Vâng, điều đó có nghĩa là tháng và ngày sẽ không bao giờ hoàn toàn lấp đầy thanh tiến trình.
Thời lượng tháng khác nhau và năm nhuận
Các tháng khác nhau có số ngày khác nhau và sản lượng phải phản ánh điều này bao gồm cả năm nhuận. Thanh tiến trình cho ngày 6 tháng 2 năm 2017 sẽ khác với thanh tiến trình cho ngày 6 tháng 2 năm 2016 (hoặc ngày 6 tháng 1 của cả hai năm).
Linh tinh
- Du hành thời gian sử dụng lịch Gregorian proleptic . TL; DR: Không có trường hợp đặc biệt nào như mất tích vào năm 1752 . Đầu vào sẽ bao gồm các ngày trong năm 0 AD
- Du khách thời gian bỏ qua tiết kiệm ánh sáng ban ngày.
- Chương trình không bắt buộc phải tính đến giây nhuận, nhưng có thể.
Đầu ra
Chương trình (hoặc chức năng) phải in (hoặc trả về dưới dạng chuỗi) một thanh tiến trình 20 ký tự theo chiều ngang được "điền" cho thời gian đã trôi qua và "mở" trong thời gian còn lại. Nó phải "điền" từ trái sang phải.
Thanh tiến trình phải có nhãn ở bên trái hiển thị phần đầu của giai đoạn được tính và một nhãn khác ở bên phải hiển thị phần đầu của giai đoạn tiếp theo, có cùng định dạng với đầu vào (nhưng chỉ hiển thị hai đơn vị chính xác). Ví dụ 2016-12-14
đầu ra hợp lệ của chúng tôi sẽ là:
12-01 #########----------- 01-01
Dưới đây là các định dạng nhãn hợp lệ cho từng giai đoạn có thể:
- Tháng:
YYYY-MM
- Ngày:
MM-DD
- Giờ:
DDThh
- Phút:
hh:mm
- Giây:
mm:ss
- Một phần nghìn giây:
ss.sss
Không có đơn vị bổ sung có thể được bao gồm trong các nhãn, và không có đơn vị nào có thể được bỏ qua.
Ghi chú đầu ra
- Các đơn vị "điền vào" của thanh tiến trình sẽ được biểu thị bằng một
#
ký tự. Các đơn vị "Mở" sẽ được đại diện bởi-
. - Phải có chính xác một khoảng trắng giữa thanh tiến trình và mỗi nhãn.
- Không gian hàng đầu hoặc dấu và / hoặc một dòng mới duy nhất được cho phép.
Chiến thắng
Đây là mã golf . Mã ngắn nhất trong byte thắng. Quy tắc tiêu chuẩn áp dụng. Sơ hở tiêu chuẩn bị cấm.
Ví dụ
Input Output
----------------------- -------------------------------------
2016-12-12T12:17 12:00 ######-------------- 13:00
2016-12-12 12-01 #######------------- 01-01
0000-01-01T00:00:00.000 00.000 -------------------- 01.000
0000-01-01T00:00 00:00 -------------------- 01:00
1899-12-31T23 31T00 ###################- 01T00
1899-12-31 12-01 ###################- 01-01
1899-12 1899-01 ##################-- 1900-01
1982-05-15T17:15 17:00 #####--------------- 18:00
1982-05-15T17 15T00 ##############------ 16T00
1982-05 1982-01 #######------------- 1983-01
9999-12-31T23:59:59.999 59.000 #################### 00.000
9999-12 9999-01 ##################-- 10000-01
2000-01-06 01-01 ###----------------- 02-01
2000-02-06 02-01 ###----------------- 03-01
2001-02-06 02-01 ####---------------- 03-01
1742-09-10 09-01 ######-------------- 10-01