Trong cuốn sách xuất sắc và hấp dẫn của Vernor Vinge, A Deepness in the Sky (nhân tiện, tôi đánh giá cao 1 ), Qeng Ho , một nền văn hóa trải dài trên nhiều hệ thống sao khác nhau, không có khái niệm về "ngày", "tháng", "" năm, "vv, và do đó có một hệ thống chấm công duy nhất đo thời gian hoàn toàn tính bằng giây. Các đơn vị được sử dụng phổ biến nhất là Ksec (kilosecond), Msec (megasecond) và Gsec (gigasecond). Đây là một biểu đồ tiện dụng từ bản sao của cuốn sách của tôi (vì tôi không thể tìm thấy nó trực tuyến):
Bạn hiện đang bay trên Phạm Nuwen , và bạn vừa nhận được một tin nhắn từ một hành tinh lạ, chưa biết tên là " Trái đất ". 2 Họ sử dụng các đơn vị thời gian khác nhau so với bạn và máy tính của bạn không nhận ra chúng. Là nhà lập trình-khảo cổ học thường trú của con tàu, công việc của bạn là vá mã xử lý thời gian để nó nhận ra các đơn vị thời gian của Trái đất .
Đương nhiên, vì bạn chỉ bị cảm lạnh vì một vài Ksec khác, bạn muốn làm cho mã của mình càng ngắn càng tốt để có thể viết nhanh chóng. May mắn thay, như một văn hóa giao dịch giữa các vì sao, Qeng Ho có quyền truy cập vào mọi ngôn ngữ lập trình được phát minh.
Đầu vào
Đầu vào sẽ là một chuỗi chứa một hoặc nhiều thành phần được phân tách bằng dấu cách
. Một thành phần được định nghĩa là một số nguyên> 0 và ≤ 255, sau đó là một không gian, và sau đó một trong những second
, minute
, hour
, day
, week
, month
,
year
, decade
, hay century
, có thể là số nhiều (với một bổ sung s
, hoặc
centuries
đối với trường hợp cuối cùng).
Dưới đây là một số ví dụ đầu vào hợp lệ:
10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds
Bạn có thể giả sử như sau về đầu vào:
Số nhiều của các đơn vị sẽ luôn luôn đồng ý với số lượng có liên quan.
Nếu có nhiều thành phần trong đầu vào, chúng sẽ luôn theo thứ tự chiều dài giảm dần.
Dưới đây là ý nghĩa của các đơn vị đầu vào khác nhau, cho mục đích của thách thức này:
unit relative absolute
---------------------------------------
second 1 second 1 second
minute 60 seconds 60 seconds
hour 60 minutes 3600 seconds
day 24 hours 86400 seconds
week 7 days 604800 seconds
month 30 days 2592000 seconds
year 365 days 31536000 seconds
decade 10 years 315360000 seconds
century 10 decades 3153600000 seconds
Đầu ra
Dưới đây là các đơn vị Qeng Ho mà mã của bạn phải hỗ trợ:
unit relative absolute
----------------------------------------
second 1 second 1 second
Ksec 1000 seconds 1000 seconds
Msec 1000 Ksecs 1000000 seconds
Gsec 1000 Msecs 1000000000 seconds
Sử dụng thuật toán sau để xác định đầu ra mã của bạn:
Đầu tiên, cộng tổng thời gian mà đầu vào đại diện.
Tìm đơn vị Qeng Ho lớn nhất ngắn hơn hoặc cùng thời gian với đầu vào cơ bản, tìm đơn vị lớn nhất có ít nhất một trong số đó.
Chuyển đổi tổng thời gian đã cho trong đầu vào thành đơn vị này và xuất kết quả, làm tròn thành ba chữ số thập phân.
Bạn có thể lựa chọn phương pháp nào sau đây để sử dụng: làm tròn lên, làm tròn xuống, làm tròn từ số 0 hoặc làm tròn theo hướng hoặc -∞. Nếu kết quả làm tròn kết thúc 0
, bạn có thể xóa các số 0 ở cuối hoặc giữ bao nhiêu tùy ý (hoặc thực hiện cả hai, tùy thuộc vào đầu vào).
Nếu kết quả được làm tròn là chính xác 1.000
, bạn phải sử dụng hình thức số ít ( second
, Ksec
, Msec
, Gsec
); cách khác, sử dụng các hình thức số nhiều ( seconds
,
Ksecs
, Msecs
, Gsecs
).
Trong một số trường hợp cạnh nhất định, bạn có thể đang sử dụng đơn vị của, ví dụ, Ksec, nhưng thu được kết quả làm tròn 1000.000 Ksec. Trong trường hợp này, bạn có thể chỉ cần xuất ra
1000.000 Ksecs
thay vì 1 Msec
.
Bạn luôn có thể cho rằng đầu vào theo thứ tự giảm dần của các đơn vị (thế kỷ, thập kỷ, năm, v.v.); hơn nữa, thành phần đi sau bất kỳ đơn vị nào sẽ luôn ngắn hơn (nghĩa là 1 decade 20 years
đầu vào không hợp lệ).
Các trường hợp thử nghiệm
Lưu ý: kết quả được đánh dấu bằng dấu hoa thị ( *
) có thể thay đổi theo số lượng không đáng kể do chênh lệch làm tròn.
input output
-------------------------------------------------------------
1 hour 3.600 Ksecs
1 day 86.400 Ksecs
2 weeks 1.210 Msecs
1 year 31.536 Msecs
32 years 1.009 Gsecs *
1 second 1.000 second
1 century 6 decades 5.046 Gsecs *
255 centuries 804.168 Gsecs
2 weeks 6 days 1 hour 19 minutes 4 seconds 1.733 Msecs
1 week 3 days 3 hours 7 minutes 875.220 Ksecs
1 week 4 days 13 hours 46 minutes 40 seconds 1.000 Msec
2 months 2 hours 5.191 Msecs *
16 minutes 39 seconds 999.000 seconds
Quy tắc
- Đây là mã golf , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.
1: chỉ khi bạn thích scifi cứng, tất nhiên. Trong trường hợp đó, tôi khuyên bạn nên đọc A Fire By the Deep trước, điều này (theo ý kiến của tôi) thậm chí còn tuyệt vời hơn.
2: tốt, về mặt kỹ thuật "Trái đất cũ" được nhắc đến nhiều lần trong A Deepness in the Sky , nhưng ...
2 months 2 hours
là "2 tháng * 2 giờ."