Script más corto que da el tiempo transcurrido desde una marca de tiempo de Unix

9

Lo que debe hacer para ganar este desafío es escribir el script "timeago" más corto que genere la cantidad de décadas, años, semanas, días, horas, minutos y segundos entre una marca de tiempo Unix determinada y el tiempo en que se ejecuta el script.

Debe dar la diferencia de tiempo en "los términos más bajos", por ejemplo, 1 weekno 7 days, 9 yearsno 0 decades 9 years. También debe usar formas plurales correctamente, por ejemplo, 1 dayno 1 days.

Su secuencia de comandos debe tener una precisión de más o menos 1 segundo (por lo que el segundo método de redondeo exacto no es 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

El resultado debe ser de la forma

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

donde A...Gestán todos los enteros no negativos y ssolo está ahí para los plurales.

Notas

  • La marca de tiempo siempre será un tiempo del pasado. Puede ser negativo
  • La entrada y la salida pueden ser razonables: stdin / stdout, entrada de función y valor de retorno, etc.
  • No puede usar ninguna herramienta que ya lo haga. es decir, si su idioma tiene una timesince(timestamp)función incorporada, no puede usar esa función.

Lo he editado ampliamente para aclararlo con la esperanza de calmar la batalla un tanto tonta entre los nuevos usuarios con preguntas poco claras y los viejos usuarios que requieren perfección. No era una pregunta terrible (aunque ahora puede ser demasiado similar a esto ).

Dado que ha pasado suficiente tiempo desde la última respuesta, ¡declaro Three If By Whisky con su implementación Ruby de 177 bytes como el ganador de este contexto!

Adam Barak
fuente
2
"En el caso de Javascript, JQuery está prohibido: P Todo lo demás está bien". - ¿está permitido Zepto , entonces?
John Dvorak
44
La especificación es un poco pobre. Proporcione una definición exacta de lo que se supone que debe hacer; una implementación de ejemplo no es suficiente.
John Dvorak
1
¿Timeago es un nuevo lenguaje de script? ¿La actualización cada 30 segundos es opcional (como se indica en un lugar) o un requisito (como se indica en otro)? ¿Qué mecanismos de E / S son aceptables? ¿Qué redondeo se debe usar? En particular, ¿cómo interactúa el redondeo con períodos de tiempo de longitud variable, como meses y años calendario? Algunos de estos pueden implicar preguntas de seguimiento dependiendo de sus respuestas.
Peter Taylor
1
@Abdossam Sé que todos parecemos bastante quisquillosos, pero es porque se supone que las preguntas en este sitio tienen un criterio objetivo ganador y una especificación clara .
Aficiones de Calvin
1
Dos sugerencias: 1) omita la parte HTML. Supongo que nadie quiere escribir un analizador HTML antes de poder abordar la verdadera tarea de imprimir tiempos. 2) Deje en claro que restringe a "segundo (s)", "minuto (s)", "hora (s)" y "día (s)". Puede agregar "semana (s)" si lo desea. Pero los meses y años no están tan claramente definidos (28-31 días / 365 o 366 días ...). Esto debería solucionar las principales preocupaciones con esta pregunta en mi punto de vista.
Falko

Respuestas:

2

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

No hay nada particularmente inteligente aquí, pero sospecho que todavía está muy cerca de lo óptimo.

Ejecución de ejemplo

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"
Tres si por whisky
fuente
2

J 165

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

Probablemente se pueda jugar más al golf. Utiliza una llamada de shell hasta la fecha para obtener el tiempo actual de Unix epoch, ya que Unix epoch no está disponible en J.

Ejemplo de ejecución:

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

Salida para una marca de tiempo 999996400 segundos en el pasado:

3 decades 1 year 37 weeks 46 minutes 39 seconds
Falko
fuente
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)};

También el código nominificado para los curiosos.

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)

}

Se actualiza cada 30 segundos y calcula tanto en singular como en plural.

Para ejecutarlo use t(unix_timestamp)

usuario965091
fuente
¿No deberías usar la notación de flecha gorda?
orgulloso Haskeller
@ user965091 Evite lanzar acusaciones sin ninguna prueba a través de comentarios públicos en publicaciones no relacionadas; Si cree que alguien está usando una cuenta de calcetines, marque una publicación suya para la atención del moderador. No veo absolutamente ninguna razón para sospechar de cualquier calcetín aquí, e incluso si existiera, tal discusión no debería tener lugar en público.
Pomo de la puerta
@ user965091 No veo cómo ninguno de los comentarios aquí podría considerarse "provocaciones". En cualquier caso, la grosería no se tolera en la red de Stack Exchange . Intente ser cortés con todos los usuarios, independientemente de si sospecha que están infringiendo las reglas o por cualquier otro motivo.
Pomo de la puerta
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)}

para ejecutar el uso t(secondsInFuture);

Victoria
fuente
1
Cuando corro t(10)me sale un vacío alert.
Ingo Bürk
Ugh, olvidé los segundos, gracias @ IngoBürk. Para ser claros est(new Date()/1000 + 10);
Victoria
Use la notación de flecha gruesa de ES6, también eval(i)es 2 bytes más corta que 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):'');}

para ejecutar desde la consola Javascript, llame

g(unixTimestamp);
DaveMorganTexas
fuente