Schreiben Sie ein kurzes Programm, das eine positive Anzahl von Sekunden für ein Alter benötigt und eine Schätzung dieser Zeit auf Englisch ausgibt.
Ihr Programm muss die am wenigsten genaue verstrichene Zeit unter den folgenden Metriken und deren Länge in Sekunden ausgeben :
second = 1
minute = 60
hour = 60 * 60
day = 60 * 60 * 24
week = 60 * 60 * 24 * 7
month = 60 * 60 * 24 * 31
year = 60 * 60 * 24 * 365
Beispiele
input : output
1 : 1 second
59 : 59 seconds
60 : 1 minute
119 : 1 minute
120 : 2 minutes
43200 : 12 hours
86401 : 1 day
1815603 : 3 weeks
1426636800 : 45 years
Wie Sie oben sehen können, geben wir nach der Zeit von beispielsweise 1 Tag (60 * 60 * 24 = 86400 Sekunden) keine Minute (n) oder Stunde (n) mehr aus , sondern nur noch Tage, bis wir die Zeit von einer Woche überschreiten , und so weiter.
Betrachten Sie die angegebene Zeitspanne als Alter. Zum Beispiel ist nach 119 Sekunden 1 Minute vergangen , nicht 2.
Regeln
- Keine Angabe für 0 oder negative Eingänge.
- Folgen Sie der richtigen Pluralisierung. Jedes Maß größer als 1 muss ein
s
Nachfolgen des Wortes enthalten. - Sie dürfen keine bereits vorhandene Bibliothek verwenden, die die Funktion des gesamten Programms erfüllt.
- Dies ist ein Code Golf, das kürzeste Programm gewinnt die Internet Points.
- Habe Spaß!
Antworten:
Jelly , 62 Bytes
Ein volles Programm druckt das Ergebnis aus.
(Als monadische Verknüpfung wird eine Liste mit einer ganzen Zahl gefolgt von Zeichen zurückgegeben.)
Probieren Sie es online!
Wie?
quelle
C
194,180144128 ZeichenVielen Dank an @gastropher für die Code-Kürzungen. Ich habe vergessen, dass C implizite Parameter mit K & R-Funktionen erlaubt! Vielen Dank auch an @gmatht für die Idee, Literale anstelle von Arrays einzufügen. Ich erweitert , dass die Charaktere durch
missbrauchenVorteil von Breitzeichen / Aufnahmechar16_t
Strings! Der Compiler scheint jedoch nicht\1
in seiner Form zu gefallen .Probieren Sie es online!
Originelle Lösung
Ich habe die Arrays in separate Zeilen aufgeteilt, um den Rest der Lösung besser erkennen zu können.
Probieren Sie es online!
Wenn wir die Divisoren in der Reihenfolge vom größten zum kleinsten ausführen, erhalten wir die gröbste Zeiteinheit. Das Programm verhält sich falsch, wenn Sie 0 Sekunden eingeben, aber da die Spezifikation diesen Wert ausdrücklich ausschließt, halte ich das für akzeptabel.
quelle
Perl 5 , 110 Bytes
Probieren Sie es online!
quelle
Stax , 54 Bytes
Führen Sie es aus und debuggen Sie es
Hier ist die entpackte, ungolfierte ASCII-Darstellung desselben Programms.
Da es nach der Ausführung keine andere Ausgabe gibt, wird implizit die Oberseite des Stapels gedruckt.
Führen Sie dieses aus
quelle
JavaScript (ES6), 131 Byte
Probieren Sie es online!
quelle
,
) war mir nicht bekannt . Ich habe etwas Neues gelernt. Großartige Lösung.split
das Array tatsächlich übergeben wird[',']
. Daher funktioniert dies nur mit Funktionen, die einen Zwang zu einer Zeichenfolge erzwingen.Java 8,
197195157 Bytes-38 Bytes dank @ OlivierGrégoire .
Erläuterung:
Probieren Sie es online aus.
quelle
/=
wo es nötig war.n->{for(int t=60,d[]={1,t,t*=60,t*=24,t*7,t*31,t*365},x=7;;)if(n>=d[--x])return(n/=d[x])+" "+"second,minute,hour,day,week,month,year".split(",")[x]+(n>1?"s":"");}
(162 Bytes), wahrscheinlich eine gute Basis zum Golfen.n/7+
anstelle von(n/=7)+
etc.2678400
, sollte die Ausgabe1 month
statt1 months
(Singular statt Plural) sein.Kotlin ,
205203196 BytesProbieren Sie es online!
quelle
T-SQL , 306 Byte (281 Byte ohne E / A)
quelle
TRIM
nicht definiert, sollte dies evtl. seinLTRIM
. Zwischenweek
undday
, Sie haben eine+
, sollte möglicherweise eine sein,
+
ein sein,
und das habe ich jetzt korrigiert. DieTRIM
Funktion ist jedoch seit SQL Server 2017 definiert. Danke.R , 157 Bytes
Probieren Sie es online!
cut
ist praktisch, da es Bereiche infactor
s aufteilt , die intern alsinteger
s gespeichert werden , was bedeutet, dass wir sie auch als Array-Indizes verwenden können. Wir können mit den Zeitperiodennamen wahrscheinlich etwas schlaueres machen, aber ich kann es noch nicht herausfinden.quelle
APL + WIN,
88119 BytesDie Originalfassung verpasste Wochen und Monate, wie von Phil H. ausgeführt.
Fordert die Bildschirmeingabe in Sekunden an
Erläuterung
quelle
JavaScript (Node.js) , 177 Byte
Probieren Sie es online!
quelle
Batch, 185 Bytes
quelle
Python 2 ,
146144 BytesProbieren Sie es online!
Jonathan Allan hat 2 Bytes gespart
quelle
if n/x
Speichert ein Byte.0
anderer gespeichert.PHP , 183 Bytes
Probieren Sie es online!
quelle
Julia 0,6 , 161 Bytes
Probieren Sie es online!
quelle
Ruby , 129 Bytes
Probieren Sie es online!
quelle
Perl 6 / Rakudo 138 Bytes
Ich bin mir sicher, dass es noch weiter geht, aber fürs Erste
Erläutern:
quelle
R 336
In Bearbeitung
quelle
R , 246 Bytes
Probieren Sie es online!
Dies ist die Verwendung von Zeitformatierung anstelle von Arithmetik, nur zum Teufel. Vielleicht könnten andere das kleiner machen?
quelle