유닉스 타임 스탬프 이후 경과 된 시간을 제공하는 가장 짧은 스크립트


9

이 과제를 해결하기 위해해야 ​​할 일은 주어진 Unix 타임 스탬프 와 스크립트 실행 시간 사이에 수십, 년, 주, 일, 시간, 분 및 초를 출력하는 가장 짧은 "timeago"스크립트를 작성하는 것입니다.

"가장 낮은 용어"로 시차를 제공해야합니다 (예 : 1 weeknot 7 days, 9 yearsnot) 0 decades 9 years. 또한 복수형을 올바르게 사용해야합니다 (예 : 1 daynot) 1 days.

스크립트는 플러스 또는 마이너스 1 초 이내에 정확해야합니다 (따라서 정확한 두 번째 반올림 방법은 중요하지 않습니다).

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

출력 형식이어야합니다

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

A...G음이 아닌 정수는 모두 어디에 있고 s복수에만 있습니다.

노트

  • 타임 스탬프는 항상 과거의 시간입니다. 부정적 일 수 있습니다.
  • 입력 및 출력은 stdin / stdout, 함수 입력 및 반환 값 등 합리적인 것이 될 수 있습니다.
  • 이미이 작업을 수행하는 도구를 사용할 수 없습니다. 즉, 언어에 timesince(timestamp)내장 된 기능 이있는 경우 해당 기능을 사용할 수 없습니다.

불분명 한 질문을 가진 신규 사용자와 완벽을 필요로하는 기존 사용자 사이의 다소 어리석은 싸움을하기 위해이를 명확하게하기 위해 이것을 크게 편집했습니다. 끔찍한 질문은 아니었지만 (지금은 이것 과 너무 비슷할 수 있습니다 ).

충분한 시간이 마지막 대답이 경과되는 것을 감안할 때, 나는 선언 세 가지 경우에 의해 위스키를 그와 177 바이트 루비 구현이 문맥의 승자!


2
"자바 스크립트의 경우 JQuery는 금지되어 있습니다. : P 그 밖의 모든 것은 괜찮습니다." -됩니다 Zepto은 다음 허용?
John Dvorak

4
사양이 다소 나쁩니다. 수행해야 할 작업에 대한 정확한 정의를 제공하십시오. 예제 구현으로는 충분하지 않습니다.
John Dvorak

1
Timeago는 새로운 스크립팅 언어입니까? 30 초마다 업데이트가 선택 사항 (한 곳에서 언급 한 바와 같이) 또는 요구 사항 (다른 곳에서 언급 한대로)입니까? 어떤 I / O 메커니즘이 허용됩니까? 어떤 반올림을 사용해야합니까? 특히 반올림은 달력 월 및 연도와 같은 가변 길이 기간과 어떻게 상호 작용합니까? 이 중 일부는 답변에 따라 후속 질문을 암시 할 수 있습니다.
피터 테일러

1
@Abdossam 나는 우리 모두가 꽤 까다로운 것처럼 보이지만이 사이트의 질문은 객관적인 승리 기준 명확한 사양 을 가지고 있기 때문 입니다.
Calvin 's Hobbies

1
두 가지 제안 : 1) HTML 부분은 제외하십시오. 인쇄 시간의 실제 작업을 수행하기 전에 아무도 HTML 파서를 작성하고 싶지 않습니다. 2) "초 (들)", "분 (들)", "시간 (들)"및 "일 (들)"로 제한해야합니다. 원하는 경우 "주"를 추가 할 수 있습니다. 그러나 월과 년은 명확하게 정의되어 있지 않습니다 (28-31 일 / 365 또는 366 일 ...). 이것은 내 관점 에서이 질문에 대한 주요 관심사를 해결해야합니다.
Falko

답변:


2

루비, (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}*' '}

여기에는 특히 영리한 것이 없지만 여전히 최적에 가깝다고 생각합니다.

예제 실행

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'"_))))

아마 더 골프를 칠 수 있습니다. 유닉스 시대는 J에서는 사용할 수 없으므로 현재 유닉스 시대를 얻기 위해 현재까지 쉘 호출을 사용합니다.

예제 실행 :

;' '&,@":&.>@((#~([:*&>{."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

파이썬-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

과거의 타임 스탬프 999996400 초 동안 출력 :

3 decades 1 year 37 weeks 46 minutes 39 seconds

1

자바 스크립트, 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)};

또한 호기심 많은 사람들을위한 축소되지 않은 코드

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)

}

30 초마다 업데이트되며 단수 및 복수를 모두 계산합니다.

그것을 실행하려면 t(unix_timestamp)


팻 화살표 표기법을 사용해서는 안됩니까?
자랑스런 Haskeller

@ user965091 관련없는 게시물에 대한 공개 의견을 통해 증거없이 고발을 피하십시오. 누군가가 양말 계정을 사용하고 있다고 생각되면 운영자의 관심을 끌기 위해 게시물을 신고하십시오. 나는 여기에서 어떤 양말 인형극을 의심 할 이유가 전혀 없다고 생각한다.
Doorknob

@ user965091 여기에 어떤 의견이 "도발"로 간주 될 수 있는지 모르겠습니다. 어쨌든 스택 Exchange 네트워크에서 무례 함은 용납되지 않습니다 . 규칙을 위반 한 것으로 의심되거나 다른 이유로 모든 사용자에게 정중 한 태도를 유지하십시오 .
Doorknob

1

자바 스크립트, 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)}

사용하기 위하여 t(secondsInFuture);


1
내가 달릴 때 나는 t(10)빈 것을 얻는다 alert.
Ingo Bürk

@ IngoBürk에게 감사합니다. 그것의 t(new Date()/1000 + 10);
Victory

ES6의 팻 화살표 표기법을 사용하십시오. 또한 eval(i)2 바이트보다 짧습니다 window[i].
nyuszika7 시간

0

자바 스크립트, 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):'');}

자바 스크립트 콘솔에서 실행하려면

g(unixTimestamp);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.