Kịch bản ngắn nhất cho thời gian trôi qua kể từ dấu thời gian Unix


9

Những gì bạn cần làm để chiến thắng thử thách này là viết kịch bản "timeago" ngắn nhất tạo ra số thập kỷ, năm, tuần, ngày, giờ, phút và giây giữa dấu thời gian Unix nhất định và thời gian tập lệnh được chạy.

Bạn phải đưa ra sự khác biệt về thời gian trong "điều khoản thấp nhất", ví dụ là 1 weekkhông 7 days, 9 yearskhông 0 decades 9 years. Bạn cũng phải sử dụng các hình thức số nhiều một cách chính xác, ví dụ 1 daykhông 1 days.

Kịch bản của bạn phải chính xác trong vòng cộng hoặc trừ 1 giây (vì vậy phương pháp làm tròn chính xác thứ hai là không quan trọng).

Time Equivalency Table
1 decade = 10 years
1 year = 31536000 seconds (not technically correct but close enough)
1 week = 7 days
1 day = 24 hours
1 hour = 60 minutes
1 minute = 60 seconds

Đầu ra phải có dạng

A decade(s) B year(s) C week(s) D day(s) E hour(s) F minute(s) G second(s)

trong đó A...Gtất cả các số nguyên không âm và schỉ có ở đó cho số nhiều.

Ghi chú

  • Dấu thời gian sẽ luôn là một thời gian từ quá khứ. Nó có thể là tiêu cực.
  • Đầu vào và đầu ra có thể là bất cứ điều gì hợp lý: stdin / stdout, đầu vào hàm và giá trị trả về, v.v.
  • Bạn không thể sử dụng bất kỳ công cụ đã làm điều này. tức là nếu ngôn ngữ của bạn có timesince(timestamp)chức năng được tích hợp sẵn thì bạn không thể sử dụng chức năng đó.

Tôi đã chỉnh sửa rất nhiều điều này để làm cho nó rõ ràng hơn với hy vọng sẽ làm dịu cuộc chiến có phần ngớ ngẩn giữa những người dùng mới với những câu hỏi không rõ ràng và những người dùng cũ đòi hỏi sự hoàn hảo. Đó không phải là một câu hỏi khủng khiếp (mặc dù bây giờ nó có thể quá giống với điều này ).

Cho rằng thời gian đã trôi qua kể từ câu trả lời cuối cùng, tôi tuyên bố Three If By Whiskey với 177 byte Ruby thực hiện, người chiến thắng trong bối cảnh này!


2
"Trong trường hợp Javascript JQuery bị cấm: P Mọi thứ khác đều ổn." - Zepto có được phép không?
John Dvorak

4
Thông số kỹ thuật là kém. Vui lòng cung cấp một định nghĩa chính xác về những gì nó phải làm - một ví dụ thực hiện không đủ.
John Dvorak

1
Timeago có phải là một ngôn ngữ kịch bản mới? Được cập nhật cứ sau 30 giây tùy chọn (như đã nêu ở một nơi) hoặc một yêu cầu (như đã nêu ở nơi khác)? Cơ chế I / O nào được chấp nhận? Nên làm tròn số nào? Cụ thể, làm tròn tương tác với các khoảng thời gian có độ dài thay đổi như tháng và năm theo lịch như thế nào? Một số trong số này có thể ngụ ý các câu hỏi tiếp theo tùy thuộc vào câu trả lời của bạn.
Peter Taylor

1
@Abdossam Tôi biết tất cả chúng ta có vẻ khá cầu kỳ nhưng đó là vì các câu hỏi trên trang web này được cho là có tiêu chí chiến thắng khách quan một thông số rõ ràng .
Sở thích của Calvin

1
Hai gợi ý: 1) Bỏ phần HTML. Tôi đoán không ai muốn viết một trình phân tích cú pháp HTML trước khi có thể giải quyết công việc thực sự là in thời gian. 2) Làm rõ rằng bạn giới hạn ở "giây (s)", "phút (s)", "giờ (s)" và "ngày (s)". Bạn có thể thêm "tuần (s)" nếu bạn muốn. Nhưng tháng và năm không được xác định rõ ràng (28-31 ngày / 365 hoặc 365 ngày ...). Điều này sẽ khắc phục mối quan tâm lớn với câu hỏi này theo quan điểm của tôi.
Falko

Câu trả lời:


2

Hồng ngọc, 184 177

->n{x=Time.now.to_i-n;d=[3650*y=86400,365*y,7*y,y,3600,60,1];(0..6).map{|i|c=x/d[i];(x%=d[i]*c;"#{c} #{%w[decade year week day hour minute second][i]}#{c<2?'':'s'}")if c>0}*' '}

Không có gì đặc biệt thông minh ở đây, nhưng tôi nghi ngờ nó vẫn rất gần với tối ưu.

Chạy ví dụ

p ->n{x=Time.now.to_i-n;d=[3650*y=86400,365*y,7*y,y,3600,60,1];(0..6).map{|i|c=x/d[i];(x%=d[i]*c;"#{c} #{%w[decade year week day hour minute second][i]}#{c<2?'':'s'}")if c>0}*' '}[0]
"4 decades 4 years 41 weeks 3 days 14 hours 20 minutes 48 seconds"

2

J, 165

;' '&,@":&.>@((#~([:*&>{."1))@((;:' decades years weeks days hours minutes seconds')(],.([}.~[:-1=])&.>)<"0@(_ 10 52 7 24 60 60&#:)@(-~([:".@}:[:2!:0'date +%s'"_))))

Có lẽ có thể được chơi golf nhiều hơn. Sử dụng một cuộc gọi shell cho đến nay để có được thời gian unix hiện tại, vì epoch Unix không có sẵn trong J.

Chạy ví dụ:

;' '&,@":&.>@((#~([:*&>{."1))@((;:' decades years weeks days hours minutes seconds')(],.([}.~[:-1=])&.>)<"0@(_ 10 52 7 24 60 60&#:)@(-~([:".@}:[:2!:0'date +%s'"_)))) 0
4 decades 4 years 41 weeks 3 days 12 hours 54 minutes 1 second

2

Con trăn - 183

import time;t=int(time.time()-input());d=86400
for f,u in zip((3650*d,365*d,7*d,d,3600,60,1),'decade year week day hour minute second'.split()):
 if t/f:print`t/f`,u+'s'*(t/f>1),;t%=f

Đầu ra cho dấu thời gian 999996400 giây trong quá khứ:

3 decades 1 year 37 weeks 46 minutes 39 seconds

1

JavaScript, 392

t=function(c){i=function(){var a=+new Date/1e3-c,b=document;29>a?b.write("just now"):60>a?b.write((a|0)+" seconds ago"):60<a&&120>a?b.write("1 minute ago"):60>a/60?b.write((a/60|0)+" minutes ago"):60<a/60&&120>a/60?b.write("1 hour ago"):24>a/3600?b.write((a/3600|0)+" hours ago"):24<a/3600&&48>a/3600?b.write("1 day ago"):1<=a/86400&&b.write((a/86400|0)+" days ago")};i();setInterval(i,3e4)};

Ngoài ra mã chưa hoàn thành cho những người tò mò

t = function(timestamp){

i = function() {
var diff = (+new Date/1e3)-(timestamp),
d = document;

    if( (diff) < 29) {

        d.write( 'just now' )
    }
    else if( diff < 60) {

        d.write( ( (diff) |0 ) + ' seconds ago' )
    }
    else if( diff > 60 && diff < 120) {
        d.write(  '1 minute ago' )
    }
    else if( (diff)/60 < 60) {
        d.write( ( (diff)/60 |0 ) + ' minutes ago' )
    }
    else if( (diff)/60 > 60 && (diff)/60 < 120) {
        d.write( '1 hour ago' )
    }
    else if( (diff)/3600 < 24) {
        d.write( ( (diff)/3600 |0 ) + ' hours ago' )
    }
    else if( (diff)/3600 > 24 && (diff)/3600 < 48) {
        d.write( '1 day ago' )
    }
    else if( (diff)/86400 >= 1) {
        d.write( ( (diff)/86400 |0 ) + ' days ago' )
    }
  }

i()

setInterval(i, 3e4)

}

Nó cập nhật cứ sau 30 giây và tính toán cả số ít và số nhiều.

Để chạy nó sử dụng t(unix_timestamp)


Bạn không nên sử dụng ký hiệu mũi tên chất béo?
tự hào

@ user965091 Vui lòng tránh ném xung quanh các cáo buộc mà không có bất kỳ bằng chứng nào thông qua các bình luận công khai trên các bài đăng không liên quan; nếu bạn nghĩ rằng ai đó đang sử dụng tài khoản sock, hãy gắn cờ bài đăng của họ để người điều hành chú ý. Tôi thấy hoàn toàn không có lý do để nghi ngờ bất kỳ sockpuppetry nào ở đây, và ngay cả khi có, một cuộc thảo luận như vậy không nên có ở nơi công cộng.
Doorknob

@ user965091 Tôi không thấy bất kỳ ý kiến ​​nào ở đây có thể được coi là "khiêu khích". Trong mọi trường hợp, sự thô lỗ không được dung thứ trên mạng Stack Exchange . Vui lòng cố gắng giữ lịch sự với tất cả người dùng, bất kể bạn nghi ngờ họ vi phạm quy tắc hay vì bất kỳ lý do nào khác.
Doorknob

1

Javascript, 287

function p(e,n){return e>2?e+" "+n+"s ":e+" "+n+" "}function t(e){n=new Date/1e3,l=e-n,c=1,m=60,h=60*m,d=24*h,w=7*d,y=365*d,a=10*y,s="",v={a:"Decade",y:"Year",w:"Week",d:"Day",h:"Hour",m:"Minute",c:"Second"};for(i in v)k=v[i],i=window[i],(r=Math.floor(l/i))>0&&(s+=p(r,k)),l%=i;alert(s)}

để chạy sử dụng t(secondsInFuture);


1
Khi tôi chạy t(10)tôi chỉ nhận được một sản phẩm nào alert.
Ingo Bürk

Ugh, quên mất vài giây, cảm ơn @ IngoBürk. Để được rõ ràngt(new Date()/1000 + 10);
Chiến thắng

Sử dụng ký hiệu mũi tên béo của ES6, cũng eval(i)ngắn hơn 2 byte window[i].
nyuszika7h

0

Javascript, 263

i=[315360000,31536000,604800,86400,3600,60,1];s=['decade','year','week','day','hour','minute','second'];function g(d){return p(parseInt((new Date().getTime()-d)/1000), 0);}function p(d,n){k=d-d%i[n];r=k/i[n];return (r>0?r+' '+s[n]+'(s) ':'')+(n<6?p(d-k,n+1):'');}

để chạy từ bảng điều khiển Javascript, hãy gọi

g(unixTimestamp);
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.