Script le plus court qui donne le temps écoulé depuis un horodatage Unix

9

Ce que vous devez faire pour gagner ce défi est d'écrire le script "timeago" le plus court qui génère le nombre de décennies, années, semaines, jours, heures, minutes et secondes entre un horodatage Unix donné et l'heure à laquelle le script est exécuté.

Vous devez donner la différence de temps en «termes les plus bas», par exemple 1 weeknon 7 days, 9 yearsnon 0 decades 9 years. Vous devez également utiliser correctement les formes plurielles, par exemple 1 daynon 1 days.

Votre script doit être précis à plus ou moins 1 seconde près (de sorte que la deuxième méthode d'arrondi exacte n'a pas d'importance).

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

La sortie doit être de la forme

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

A...Gsont tous les entiers non négatifs et le sest uniquement là pour les pluriels.

Remarques

  • L'horodatage sera toujours un temps du passé. Cela peut être négatif.
  • L'entrée et la sortie peuvent être raisonnables: stdin / stdout, entrée de fonction et valeur de retour, etc.
  • Vous ne pouvez pas utiliser d'outils qui le font déjà. c'est-à-dire que si votre langue a une timesince(timestamp)fonction intégrée, vous ne pouvez pas utiliser cette fonction.

J'ai énormément modifié cela pour le rendre plus clair dans l'espoir d'apaiser la bataille quelque peu idiote entre les nouveaux utilisateurs avec des questions peu claires et les anciens utilisateurs qui nécessitent la perfection. Ce n'était pas une question terrible (bien que maintenant elle puisse être trop similaire à cela ).

Étant donné que suffisamment de temps s'est écoulé depuis la dernière réponse, je déclare Three If By Whisky avec son implémentation Ruby de 177 octets le gagnant de ce contexte!

Adam Barak
la source
2
"Dans le cas de Javascript, JQuery est interdit: P Tout le reste est ok." - Zepto est-il autorisé, alors?
John Dvorak
4
La spécification est un peu pauvre. Veuillez fournir une définition exacte de ce qu'elle est censée faire - un exemple d'implémentation ne suffit pas.
John Dvorak
1
Timeago est-il un nouveau langage de script? La mise à jour toutes les 30 secondes est-elle facultative (comme indiqué dans un endroit) ou obligatoire (comme indiqué dans un autre)? Quels mécanismes d'E / S sont acceptables? Quel arrondi faut-il utiliser? En particulier, comment les arrondis interagissent-ils avec des périodes de durée variable telles que les mois et les années civils? Certains d'entre eux peuvent impliquer des questions de suivi en fonction de vos réponses.
Peter Taylor
1
@Abdossam Je sais que nous semblons tous assez difficiles mais c'est parce que les questions sur ce site sont censées avoir des critères de gain objectifs et une spécification claire .
Calvin's Hobbies
1
Deux suggestions: 1) Oubliez la partie HTML. Je suppose que personne ne veut écrire un analyseur HTML avant de pouvoir s'attaquer à la vraie tâche d'impression des temps. 2) Indiquez clairement que vous vous limitez à "seconde (s)", "minute (s)", "heure (s)" et "jour (s)". Vous pouvez ajouter "semaine (s)" si vous le souhaitez. Mais les mois et les années ne sont pas si clairement définis (28-31 jours / 365 ou 366 jours ...). À mon avis, cela devrait régler les principales préoccupations liées à cette question.
Falko

Réponses:

2

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

Il n'y a rien de particulièrement intelligent ici, mais je soupçonne que c'est toujours très proche de l'optimal.

Exemple d'exécution

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"
Trois si par whisky
la source
2

J, 165

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

Peut probablement être joué au golf plus. Utilise un appel shell à ce jour pour obtenir l'heure actuelle d'Unix, car l'époque d'Unix n'est pas disponible dans J.

Exemple d'exécution:

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

Sortie pour un horodatage de 999996400 secondes dans le passé:

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

Aussi le code non minimisé pour les curieux

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)

}

Il se met à jour toutes les 30 secondes et calcule à la fois le singulier et le pluriel.

Pour l'exécuter, utilisez t(unix_timestamp)

user965091
la source
Ne devriez-vous pas utiliser la notation des flèches grasses?
fier haskeller
@ user965091 Veuillez éviter de lancer des accusations sans aucune preuve via des commentaires publics sur des messages non liés; si vous pensez que quelqu'un utilise un compte chaussette, signalez-en un à l'attention du modérateur. Je ne vois absolument aucune raison de soupçonner une quelconque marionnette ici, et même s'il y en avait, une telle discussion ne devrait pas avoir lieu en public.
Poignée de porte
@ user965091 Je ne vois pas comment l'un des commentaires ici pourrait être considéré comme une "provocation". Dans tous les cas, l' impolitesse n'est pas tolérée sur le réseau Stack Exchange . Veuillez essayer de rester courtois avec tous les utilisateurs, que vous soupçonniez qu'ils enfreignent les règles ou pour toute autre raison.
Poignée de porte
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)}

pour exécuter l'utilisation t(secondsInFuture);

La victoire
la source
1
Quand je cours, t(10)je reçois juste un vide alert.
Ingo Bürk
Ugh, j'ai oublié les secondes, merci @ IngoBürk. Pour être clairt(new Date()/1000 + 10);
Victoire
Utilisez la notation de la flèche grasse d'ES6, également eval(i)inférieure de 2 octets 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):'');}

pour exécuter à partir de la console Javascript, appelez

g(unixTimestamp);
DaveMorganTexas
la source