Kürzestes Skript, das die seit einem Unix-Zeitstempel verstrichene Zeit angibt


9

Um diese Herausforderung zu gewinnen, müssen Sie das kürzeste "timeago" -Skript schreiben, das die Anzahl der Jahrzehnte, Jahre, Wochen, Tage, Stunden, Minuten und Sekunden zwischen einem bestimmten Unix-Zeitstempel und der Zeit, zu der das Skript ausgeführt wird , ausgibt .

Sie müssen den Zeitunterschied in "niedrigsten Begriffen" angeben, zB 1 weeknicht 7 days, 9 yearsnicht 0 decades 9 years. Sie müssen auch Pluralformen korrekt verwenden, z . B. 1 daynicht 1 days.

Ihr Skript muss auf plus oder minus 1 Sekunde genau sein (daher ist die genaue zweite Rundungsmethode unwichtig).

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

Die Ausgabe sollte die Form haben

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

wo A...Gsind alle nicht negativen ganzen Zahlen und das sist nur für Pluralformen da.

Anmerkungen

  • Der Zeitstempel ist immer eine Zeit aus der Vergangenheit. Es kann negativ sein.
  • Eingabe und Ausgabe können alles Vernünftige sein: stdin / stdout, Funktionseingabe und Rückgabewert usw.
  • Sie dürfen keine Tools verwenden, die dies bereits tun. Wenn in Ihrer Sprache eine timesince(timestamp)Funktion integriert ist, können Sie diese Funktion möglicherweise nicht verwenden.

Ich habe dies umfassend bearbeitet, um es klarer zu machen, in der Hoffnung, den etwas albernen Kampf zwischen neuen Benutzern mit unklaren Fragen und alten Benutzern, die Perfektion benötigen, zu lindern. Es war nicht eine schreckliche Frage (obwohl jetzt es zu ähnlich sein kann , dies ).

Angesichts der Tatsache, dass seit der letzten Antwort genügend Zeit vergangen ist, erkläre ich Three If By Whiskey mit seiner 177-Byte- Ruby-Implementierung zum Gewinner dieses Kontexts!


2
"Im Fall von Javascript ist JQuery verboten: P Alles andere ist in Ordnung." - Ist Zepto dann erlaubt?
John Dvorak

4
Die Spezifikation ist ein bisschen schlecht. Bitte geben Sie genau an, was es tun soll - eine Beispielimplementierung reicht nicht aus.
John Dvorak

1
Ist Timeago eine neue Skriptsprache? Ist eine Aktualisierung alle 30 Sekunden optional (wie an einer Stelle angegeben) oder eine Anforderung (wie an einer anderen Stelle angegeben)? Welche E / A-Mechanismen sind akzeptabel? Welche Rundung sollte verwendet werden? Wie interagiert die Rundung insbesondere mit Zeiträumen variabler Länge wie Kalendermonaten und -jahren? Einige davon können abhängig von Ihren Antworten Folgefragen implizieren.
Peter Taylor

1
@Abdossam Ich weiß, wir scheinen alle ziemlich pingelig zu sein, aber das liegt daran, dass Fragen auf dieser Seite objektive Gewinnkriterien und eine klare Spezifikation haben sollen .
Calvins Hobbys

1
Zwei Vorschläge: 1) Lassen Sie den HTML-Teil weg. Ich denke, niemand möchte einen HTML-Parser schreiben, bevor er die eigentliche Aufgabe der Druckzeiten bewältigen kann. 2) Stellen Sie klar, dass Sie sich auf "Sekunde (n)", "Minute (n)", "Stunde (n)" und "Tag (e)" beschränken. Sie können "Woche (n)" hinzufügen, wenn Sie möchten. Aber Monate und Jahre sind nicht so klar definiert (28-31 Tage / 365 oder 366 Tage ...). Dies sollte aus meiner Sicht die Hauptprobleme mit dieser Frage beheben.
Falko

Antworten:


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

Hier gibt es nichts besonders Kluges, aber ich vermute, es ist immer noch sehr nahe am Optimum.

Beispiellauf

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

Kann wahrscheinlich mehr Golf gespielt werden. Verwendet einen Shell-Aufruf bis heute, um die aktuelle Unix-Epochenzeit abzurufen, da die Unix-Epoche in J nicht verfügbar ist.

Beispiellauf:

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

Ausgabe für einen Zeitstempel 999996400 Sekunden in der Vergangenheit:

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

Auch der unminimierte Code für die Neugierigen

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)

}

Es wird alle 30 Sekunden aktualisiert und berechnet sowohl Singular als auch Plural.

Um es auszuführen, verwenden Sie t(unix_timestamp)


Sollten Sie nicht die Fettpfeilnotation verwenden?
stolzer Haskeller

@ user965091 Bitte vermeiden Sie es, Anschuldigungen ohne Beweise durch öffentliche Kommentare zu nicht verwandten Posts herumzuwerfen. Wenn Sie der Meinung sind, dass jemand ein Socken-Konto verwendet, markieren Sie einen seiner Beiträge, um die Aufmerksamkeit des Moderators auf sich zu ziehen. Ich sehe absolut keinen Grund, hier Sockenpuppen zu vermuten, und selbst wenn dies der Fall wäre, sollte eine solche Diskussion nicht öffentlich geführt werden.
Türknauf

@ user965091 Ich sehe nicht, wie einer der Kommentare hier als "Provokationen" angesehen werden kann. In jedem Fall wird Unhöflichkeit im Stack Exchange-Netzwerk nicht toleriert . Bitte versuchen Sie, allen Benutzern gegenüber höflich zu bleiben , unabhängig davon, ob Sie den Verdacht haben, dass sie gegen die Regeln verstoßen, oder aus einem anderen Grund.
Türknauf

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

verwenden t(secondsInFuture);


1
Wenn ich renne, t(10)bekomme ich nur eine leere alert.
Ingo Bürk

Ugh, habe die Sekunden vergessen, danke @ IngoBürk. Um klar zu sein seint(new Date()/1000 + 10);
Sieg

Verwenden Sie die Fettpfeil-Notation von ES6, die ebenfalls eval(i)2 Byte kürzer ist als 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):'');}

Rufen Sie auf, um von der Javascript-Konsole aus zu starten

g(unixTimestamp);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.