Script più breve che indica il tempo trascorso da un timestamp di Unix


9

Quello che devi fare per vincere questa sfida è scrivere lo script "timeago" più breve che fornisca il numero di decenni, anni, settimane, giorni, ore, minuti e secondi tra un dato timestamp Unix e il tempo in cui lo script viene eseguito.

È necessario indicare la differenza oraria in "termini più bassi", ad esempio 1 weekno 7 days, 9 yearsno 0 decades 9 years. È inoltre necessario utilizzare correttamente le forme plurali, ad esempio 1 dayno 1 days.

Lo script deve essere accurato entro più o meno 1 secondo (quindi il secondo metodo di arrotondamento esatto non è importante).

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

L'output dovrebbe essere nella forma

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

dove A...Gsono tutti numeri interi non negativi e sc'è solo per i plurali.

Appunti

  • Il timestamp sarà sempre un tempo dal passato. Potrebbe essere negativo.
  • L'input e l'output possono essere ragionevoli: stdin / stdout, input e valore della funzione ecc.
  • Non è possibile utilizzare strumenti che lo fanno già. cioè se la tua lingua ha una timesince(timestamp)funzione integrata non puoi usare quella funzione.

Ho ampiamente modificato questo per renderlo più chiaro nella speranza di alleviare la battaglia un po 'sciocca tra nuovi utenti con domande poco chiare e vecchi utenti che richiedono la perfezione. Non era una domanda terribile (anche se ora potrebbe essere troppo simile a questa ).

Dato che è trascorso abbastanza tempo dall'ultima risposta, dichiaro Three If By Whiskey con la sua implementazione Ruby da 177 byte il vincitore di questo contesto!


2
"Nel caso di Javascript JQuery è vietato: P Tutto il resto è ok." - allora è permesso Zepto ?
John Dvorak,

4
Le specifiche sono un po 'scadenti. Fornisci una definizione esatta di ciò che dovrebbe fare - un'implementazione di esempio non è sufficiente.
John Dvorak,

1
Timeago è un nuovo linguaggio di scripting? L'aggiornamento ogni 30 secondi è facoltativo (come indicato in un punto) o un requisito (come indicato in un altro)? Quali meccanismi I / O sono accettabili? Quale arrotondamento dovrebbe essere usato? In particolare, in che modo l'arrotondamento interagisce con periodi di tempo di durata variabile come mesi e anni di calendario? Alcuni di questi possono implicare domande di follow-up a seconda delle risposte.
Peter Taylor,

1
@Abdossam So che tutti noi sembriamo piuttosto pignoli ma è perché le domande su questo sito dovrebbero avere criteri di vincita oggettivi e una specifica chiara .
Hobby di Calvin il

1
Due suggerimenti: 1) Escludere la parte HTML. Immagino che nessuno voglia scrivere un parser HTML prima di essere in grado di affrontare il vero compito dei tempi di stampa. 2) Fai in modo di limitarti a "secondo / i", "minuto / i", "ora / e" e "giorno / i". Se lo desideri, puoi aggiungere "settimana / e". Ma mesi e anni non sono così chiaramente definiti (28-31 giorni / 365 o 366 giorni ...). Ciò dovrebbe risolvere le principali preoccupazioni di questa domanda dal mio punto di vista.
Falko,

Risposte:


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

Non c'è niente di particolarmente intelligente qui, ma sospetto che sia ancora molto vicino all'ottimale.

Esempio di esecuzione

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

Probabilmente si può giocare a golf di più. Utilizza una chiamata shell fino ad oggi per ottenere l'ora dell'epoca unix corrente, poiché l'epoca Unix non è disponibile in J.

Esempio di esecuzione:

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

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

Uscita per un timestamp 999996400 secondi nel passato:

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)};

Anche il codice non miniato per i curiosi

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)

}

Si aggiorna ogni 30 secondi e calcola sia singolare che plurale.

Per eseguirlo utilizzare t(unix_timestamp)


Non dovresti usare la notazione con la freccia grassa?
orgoglioso haskeller il

@ user965091 Si prega di evitare di gettare accuse senza alcuna prova tramite commenti pubblici su post non correlati; se ritieni che qualcuno stia utilizzando un account calzino, segnala un loro post per l'attenzione del moderatore. Non vedo assolutamente alcun motivo per sospettare che qui ci sia un po 'di sockpuppetry, e anche se ci fosse, una tale discussione non dovrebbe essere tenuta in pubblico.
Maniglia della porta

@ user965091 Non vedo come nessuno dei commenti qui possa essere considerato "provocazione". In ogni caso, la maleducazione non è tollerata sulla rete Stack Exchange . Cerca di rimanere cortese con tutti gli utenti, indipendentemente dal fatto che sospetti che stiano violando le regole o per qualsiasi altro motivo.
Maniglia della porta

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)}

per eseguire l'uso t(secondsInFuture);


1
Quando corro, t(10)mi vuoto alert.
Ingo Bürk,

Ugh, ho dimenticato i secondi, grazie @ IngoBürk. Per essere chiari il suot(new Date()/1000 + 10);
Vittoria

Utilizzare la notazione con la freccia grassa di ES6, inoltre eval(i)è di 2 byte più corta di 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):'');}

per eseguire dalla console Javascript, chiama

g(unixTimestamp);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.