Chúng ta đã xong chưa?


22

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ụ: .120không bao giờ .12). Đây Tlà 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à 01và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-01031 trong suốt tháng 12 và 2016-12-02131 , v.v.

Tương tự như vậy, 2016-01là 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-1211 / 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ã 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

4
Chúng ta có phải lo lắng về những giây nhuận không?
Riley

@Riley Câu hỏi hay. Số
Jordan

2
Tôi cho rằng Tiết kiệm ánh sáng ban ngày bị bỏ qua, vì không có một hình thức tiêu chuẩn hóa?
CAD97

3
@ CAD97 Câu hỏi hay. Bạn nói đúng. DST thực sự làm phức tạp mọi thứ cho những người du hành thời gian vì vậy chúng tôi bỏ qua nó.
Jordan

Ví dụ "1899-12-31T23" không hợp lệ theo danh sách các định dạng đầu vào được cung cấp, tương tự cho "1982-05-15T17". Vui lòng xác minh dữ liệu thử nghiệm của bạn.
zeppelin

Câu trả lời:


4

JavaScript, 282 byte

(x,v=x.split(/\D/g),l=v.length-2,[a,b,c,d]=("10e5,01,-,12,01,-,"+new Date(v[0],v[1],0).getDate()+",00,T,24,00,:,60,00,:,60,000,.,1000").split`,`.slice(l*3,l*3+4),t=(v[l+1]-b)/d*20+.5|0,n=v[l],o=((n|0)+1)%a,r=l?('0'+o).slice(-2):o)=>n+c+b+' '+'#'.repeat(t)+'-'.repeat(20-t)+' '+r+c+b

Vượt qua tất cả các bài kiểm tra

(
x,
v=x.split(/\D/g),
l=v.length-2,
[a,b,c,d]=("10e5,01,-,12,01,-,"+new Date(v[0],v[1],0).getDate()+",00,T,24,00,:,60,00,:,60,000,.,1000").split`,`.slice(l*3,l*3+4),
t=(v[l+1]-b)/d*20+.5|0,
n=v[l],
o=((n|0)+1)%a,
r=l?('0'+o).slice(-2):o
) =>n+c+b+' '+'#'.repeat(t)+'-'.repeat(20-t)+' '+r+c+b

Chức năng kiểm tra in không có gì cho vượt qua, giá trị cho thất bại.

function test(value,expected){
    if (f(value)!=expected)
    {
        console.log(value);
        console.log(f(value));
        console.log(expected);
     }
}

Các trường hợp thử nghiệm:

test('2016-12-12T12:17','12:00 ######-------------- 13:00')                 ;
test('2016-12-12','12-01 #######------------- 01-01')                       ;
test('0000-01-01T00:00:00.000','00.000 -------------------- 01.000')        ;
test('0000-01-01T00:00','00:00 -------------------- 01:00')                 ;
test('1899-12-31T23','31T00 ###################- 01T00')                    ;
test('1899-12-31','12-01 ###################- 01-01')                       ;
test('1899-12','1899-01 ##################-- 1900-01')                      ;
test('1982-05-15T17:15','17:00 #####--------------- 18:00')                 ;
test('1982-05-15T17','15T00 ##############------ 16T00')                    ;
test('1982-05','1982-01 #######------------- 1983-01')                      ;
test('9999-12-31T23:59:59.999','59.000 #################### 00.000')        ;
test('9999-12','9999-01 ##################-- 10000-01')                     ;
test('2000-01-06','01-01 ###----------------- 02-01')                       ;
test('2000-02-06','02-01 ###----------------- 03-01')                       ;
test('2001-02-06','02-01 ####---------------- 03-01')                       ;
test('1742-09-10','09-01 ######-------------- 10-01')                       ;

2
Tôi đã phải học một ngôn ngữ mới để đứng đầu phiên bản này ... nó rất súc tích!
rexroni

3

Bình thường, 213 byte

Mã đầu tiên của tôi trong pyth! Kìa:

+%h=N:[d"%.4d"\-=Z"%.2d"\-Z\TZ\:Z\:Z\."%.3d")-*2lKr:w"[-T:.]"d7 3*2lKJ@K_2+@N1+%eN=b<lK4+d+*\#=Gs+*20c-eKb@=H[0^9T12?q2=k@K1+28+q0%=YhK4-q0%Y400q0%Y100+30%+k/k8 2 24 60 60 999)lK.5+*\--20G+d+%hN%+J1@H-lK1+@N1%eNb

Mã pyth của tôi dựa trên câu trả lời trăn trước đây của tôi. Đây là phiên bản không có ý kiến ​​với các bình luận:

"K is the input, as a list of numbers"
Kr:w"[-T:.]"d7
"Y=year"
=YhK
"k=month"
=k@K1
"H = a list of denominators"
=H[0 ^9T 12 ?q2k+28+q0%Y4-q0%Y400q0%Y100 +30%+k/k8 2 24 60 60 999)
"J is the second-to-last number of the input"
J@K_2
"b is the +1 starting point for months and days"
=b<lK4
"G is the number of hashtags in the statusbar"
=Gs+*20c-eKb@HlK.5
"N is the formatted string"
=N:[d"%.4d"\-=Z"%.2d"\-Z\TZ\:Z\:Z\."%.3d")-*2lK3 *2lK
+%hNJ+@N1+%eNb+d+*\#G+*\--20G+d+%hN%+J1@H-lK1+@N1%eNb

Việc kiểm tra nhiều giá trị được thực hiện dễ dàng bằng cách tạo vòng lặp mã và thêm một bản in dòng mới vào cuối:

Wp+%h=N:[d"%.4d"\-=Z"%.2d"\-Z\TZ\:Z\:Z\."%.3d")-*2lKr:w"[-T:.]"d7 3*2lKJ@K_2+@N1+%eN=b<lK4+d+*\#=Gs+*20c-eKb@=H[0^9T12?q2=k@K1+28+q0%=YhK4-q0%Y400q0%Y100+30%+k/k8 2 24 60 60 999)lK.5+*\--20G+d+%hN%+J1@H-lK1+@N1+%eNb"\n"

Sau đó, tôi chạy cat testinput | pyth code.pyth > outputdiff output testoutput Hoặc thử trực tuyến .


2

Python 2, 371 byte

Thử thách này thật khó khăn! Có vẻ như tôi sẽ chỉ dưới 300 cho đến khi tôi tìm ra định dạng chuỗi đầu ra.

Phần thú vị là câu trả lời của tôi không sử dụng bất kỳ gói ngày nào:

import re
s=raw_input()
S=[int(i)for i in re.sub('[-T:.]',' ',s).split()]
l=len(S)
y,m=S[:2]
d=[0,20<<9,12,28+(y%4==0!=y%100)+(y%400==0)if m==2else 30+(m+m/8)%2,24,60,60,999]
a,n=S[-2:]
b=1-(1if l>3else 0)
h=int(20.*(n-b)/d[l]+.5)
x,y,z='- %.4d - %.2d - %.2d T %.2d : %.2d : %.2d . %.3d'.split()[l*2-3:l*2]
print x%a+y+z%b+' '+'#'*h+'-'*(20-h)+' '+x%((a+1)%d[l-1])+y+z%b
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.