Najkrótszy skrypt, który podaje czas, jaki upłynął od znacznika czasu Unix

9

Aby wygrać to wyzwanie, należy napisać najkrótszy skrypt „timeago”, który wyświetla liczbę dekad, lat, tygodni, dni, godzin, minut i sekund między danym znacznikiem czasu Unix a czasem uruchomienia skryptu.

Musisz podać różnicę czasu w „najniższych kategoriach”, np. 1 weekNie 7 days, 9 yearsnie 0 decades 9 years. Musisz także poprawnie używać liczby mnogiej, np . 1 dayNie 1 days.

Skrypt musi być dokładny w zakresie plus lub minus 1 sekunda (więc dokładna metoda drugiego zaokrąglania nie jest ważna).

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

Dane wyjściowe powinny mieć postać

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

gdzie A...Gwszystkie są nieujemnymi liczbami całkowitymi i sjest tam tylko dla liczby mnogiej.

Notatki

  • Znacznik czasu zawsze będzie czasem z przeszłości. To może być negatywne.
  • Wejście i wyjście może być cokolwiek sensownego: standardowe wejście / standardowe wyjście, wejście funkcji i wartość zwracana itp.
  • Nie możesz używać narzędzi, które już to robią. tzn. jeśli twój język ma timesince(timestamp)wbudowaną funkcję, nie możesz jej użyć.

Ogromnie zredagowałem to, aby wyjaśnić, w nadziei, że uda się wygasić nieco głupią bitwę między nowymi użytkownikami z niejasnymi pytaniami a starymi użytkownikami, którzy wymagają perfekcji. To nie było straszne pytanie (choć teraz może być zbyt podobne do tego ).

Biorąc pod uwagę, że od ostatniej odpowiedzi minęło wystarczająco dużo czasu, ogłaszam, że Three If By Whisky z 177 bajtową implementacją Ruby jest zwycięzcą tego kontekstu!

Adam Barak
źródło
2
„W przypadku Javascript JQuery jest zabronione: P Wszystko inne jest w porządku.” - czy w takim razie Zepto jest dozwolone?
John Dvorak
4
Specyfikacja jest trochę słaba. Podaj dokładną definicję tego, co ma zrobić - przykładowa implementacja nie wystarczy.
John Dvorak
1
Czy Timeago to jakiś nowy język skryptowy? Czy aktualizacja co 30 sekund jest opcjonalna (jak podano w jednym miejscu) lub wymagana (jak podano w innym)? Jakie mechanizmy We / Wy są dopuszczalne? Jakie zaokrąglenie należy zastosować? W szczególności, w jaki sposób zaokrąglanie współdziała z okresami o zmiennej długości, takimi jak miesiące kalendarzowe i lata? Niektóre z nich mogą sugerować pytania uzupełniające w zależności od twoich odpowiedzi.
Peter Taylor
1
@Abdossam Wiem, że wszyscy wydajemy się wybredni, ale to dlatego, że pytania na tej stronie powinny mieć obiektywne kryteria wygranej i jasną specyfikację .
Calvin's Hobbies
1
Dwie sugestie: 1) Pomiń część HTML. Chyba nikt nie chce pisać parsera HTML, zanim będzie w stanie poradzić sobie z prawdziwym zadaniem drukowania czasów. 2) Wyjaśnij, że ograniczasz się do „sekund (y)”, „minut (y)”, „godzin (y)” i „dni (dni)”. Możesz dodać „tygodnie”, jeśli chcesz. Ale miesiące i lata nie są tak jasno określone (28-31 dni / 365 lub 366 dni ...). Moim zdaniem powinno to rozwiązać główne obawy związane z tym pytaniem.
Falko

Odpowiedzi:

2

Ruby, 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}*' '}

Nie ma tu nic szczególnie sprytnego, ale podejrzewam, że wciąż jest bardzo blisko optymalnego.

Przykładowy przebieg

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"
Three If By Whisky
źródło
2

J, 165

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

Prawdopodobnie można golfa więcej. Używa do tej pory wywołania powłoki, aby uzyskać bieżący czas epoki uniksowej, ponieważ epoka uniksowa jest niedostępna w J.

Przykładowy przebieg:

;' '&,@":&.>@((#~([:*&>{."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
jpjacobs
źródło
2

Python - 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

Dane wyjściowe dla sygnatury czasowej 999996400 sekund w przeszłości:

3 decades 1 year 37 weeks 46 minutes 39 seconds
Falko
źródło
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)};

Również nieuprawniony kod dla ciekawskich

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)

}

Aktualizuje się co 30 sekund i oblicza liczbę pojedynczą i mnogą.

Aby go uruchomić, użyj t(unix_timestamp)

użytkownik965091
źródło
Nie powinieneś używać grubej notacji strzały?
dumny haskeller
@ user965091 Unikaj rzucania się na zarzuty bez żadnego dowodu poprzez publiczne komentarze na temat niepowiązanych postów; jeśli uważasz, że ktoś używa konta skarpety, oflaguj swój post, aby zwrócić uwagę moderatora. Nie widzę absolutnie żadnego powodu, by podejrzewać tu jakąkolwiek skarpetę, a nawet gdyby była, taka dyskusja nie powinna odbywać się publicznie.
Klamka
@ user965091 Nie rozumiem, w jaki sposób którykolwiek z komentarzy tutaj można uznać za „prowokację”. W każdym razie chamstwo nie jest tolerowane w sieci Stack Exchange . Postaraj się zachować uprzejmość dla wszystkich użytkowników, niezależnie od tego, czy podejrzewasz, że łamią zasady, czy z jakiegokolwiek innego powodu.
Klamka
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)}

uruchomić użycie t(secondsInFuture);

Zwycięstwo
źródło
1
Kiedy biegnę t(10), po prostu dostaję pusty alert.
Ingo Bürk
Ugh, zapomniałem sekund, dziękuję @ IngoBürk. Dla jasnościt(new Date()/1000 + 10);
zwycięstwo
Użyj grubej notacji ES6, również eval(i)jest o 2 bajty krótsza niż 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):'');}

aby uruchomić z konsoli Javascript, zadzwoń

g(unixTimestamp);
DaveMorganTexas
źródło