Der kürzeste Code, um die richtigen Uhrzeiten zu generieren, gewinnt.
Sie sind ein erfahrener Zeitreisender und es ist bekannt, dass Sie auf Ihren Reisen auf vielen Planeten Halt machen. Jeder Planet dreht sich mit einer anderen Geschwindigkeit und aus diesem Grund ist die Länge eines Tages anders als unser üblicher 24-Stunden-Tag. Infolgedessen verwenden die Planeten Uhren mit unterschiedlichen Stundenzahlen. Die Stunden auf einer Uhr mit x Stunden sind ähnlich wie bei unserer (1, 2, 3, ..., x ) angeordnet, wobei sich die Zahl im Uhrzeigersinn dreht und x oben steht.
Außerdem hat jeder Planet eine andere Anzahl von Minuten pro Stunde und eine andere Anzahl von Sekunden pro Minute. Sie erhalten eine Startzeit und eine Anzahl von Sekunden, aus denen Sie die Endzeit bestimmen müssen.
Die Eingabe kann direkt aus einer als Argument übergebenen Datei oder als Standardeingabe erfolgen. Die erste Eingabezeile gibt die Anzahl der zu verarbeitenden Takte an. Danach hat jede Uhr drei Eingabezeilen, die Ganzzahlen im folgenden Format enthalten:
x y z
h m s
t
Die Bedeutung der einzelnen Buchstaben finden Sie weiter unten.
x = Die Anzahl der Stunden pro Tag (2 <= x <= 99)
y = Die Anzahl der Minuten pro Stunde (2 <= y <= 100)
z = Die Anzahl der Sekunden pro Minute (2 <= z <= 100)
h = Die Stunde der Startzeit (1 <= h <= x)
m = Die Minute der Startzeit (0 <= m <y)
s = Die Sekunde der Startzeit (0 <= s) <z)
t = Die Anzahl der Sekunden, die vergangen sind
Die Ausgabe muss die Endzeit für jede Uhr sein, nachdem t Sekunden seit der Startzeit verstrichen sind. Ihre Ausgabe muss als Standarduhrzeit formatiert sein (HH: MM: SS). Zahlen sollten bei Bedarf aufgefüllt werden, um sicherzustellen, dass alle Zahlen zweistellig sind.
Testfälle
Eingang
2
5 20 10
1 10 5
2633
6 25 5
6 0 3
290
Ausgabe
04:13:08
02:08:03
Eingang
1
14 17 11
12 16 10
1530
Ausgabe
07:03:00
Eingang
2
8 40 25
3 1 15
10620
14 15 20
1 14 0
-580
Ausgabe
05:26:10
14:00:00
Antworten:
GolfScript - 50 Zeichen
Die Werte (H / M / S) werden erfasst, indem sie an die Vorderseite des Stapels verschoben werden (
])\
). Die Stunde 'underflow' bei 0 wird mit behandeltor
. Null-Polsterung wird behandelt100+`(;
, obwohl ich nehme an, dass0`\+-2>
es die gleiche Länge ist.quelle
Python, 142 Zeichen
quelle
for i in ' '*input()
Sie tatsächlich nutzen könnten ,i
anstatt' '
inR()+' '+R()
, spart zwei Zeichen.exec"x,y,z,h,m,s=map(int,(R()+' '+R()).split());t=input()+h*y*z+m*z+s;print'%02d:%02d:%02d'%((t/y/z-1)%x+1,t/z%y,t%z);"*input()
t/y/z%x or x
ist ein Zeichen kürzer.GolfScript
6260 ZeichenBearbeiten: Ich habe es geschafft, das Array, das zuvor in a gespeichert war, auf dem Stack zu speichern. Auf diese Weise ist ein zusätzlicher Wechsel erforderlich, aber keine wesentliche Verbesserung.
62 version:
Ich bin mir sicher, dass es viel besser geht, ich hätte mir nichts Besseres vorstellen können.
1: Erstellen Sie ein Array aller Eingaben, wählen Sie das erste Element aus und gruppieren Sie den Rest in 7er-Blöcke.
A / 13: Verwenden Sie die erste Zahl aus der Eingabe, um die Schleife so oft auszuführen.
2: Speichern Sie ein leeres Array in a.
3: Wählen Sie einen 7er-Block und erweitern Sie ihn auf 7 einzelne Zahlen.
b / 8: Führen Sie eine Schleife dreimal aus, und zwar einmal pro Sekunde, Minute und Stunde.
4: Addieren Sie die letzten beiden Zahlen für die erste Iteration, die Sekunden und die zu verschiebende Zeit ist, für die folgende Iteration sind es Minuten und Stunden mit dem Überlauf aus dem vorherigen Zyklus. Machen Sie eine zweite Kopie des Ergebnisses.
5: Teilen Sie die Kopie durch das Limit, um den Überlauf zu erzeugen und das Ergebnis um ein Leerzeichen nach hinten zu verschieben.
6: Berechnen Sie das Modulo der vorherigen Division, um einen Teil des Ergebnisses zu erhalten.
7: Fügen Sie diesen Teil dem Array a hinzu.
9: Entfernen Sie den Stundenüberlauf sowie die Sekunden- und Minutenbegrenzung vom Stapel.
10: Nehmen Sie den Stundenanteil von a. Wenn er Null ist, ersetzen Sie ihn durch das Stundenlimit, und legen Sie ihn wieder in das Array ein.
11: Setzen Sie für jedes Element in a '0' voran und konvertieren Sie es in einen String. Werfen Sie dann alles außer den letzten 2 Zeichen weg.
12: Reduzieren Sie das Array in eine einzelne Zeichenfolge, die durch ':' begrenzt ist, platzieren Sie eine neue Zeile und verschieben Sie das Array mit den verbleibenden Jobs an den Anfang des Stapels, um die nächste Iteration vorzubereiten.
quelle
J
(172/35)13799107Besteht nun alle gegebenen Testfälle.
172 ist das Ganze; 35 ist die Anzahl der Zeichen, die ich vergeben würde, wenn ich wirklich auf dem Laufenden wäre und es ablehnen würde, die E / A wie angegeben durchzuführen. (Ich habe es noch ein wenig modifiziert; clocks ist eine Funktion, die einen Dateinamen verwendet, der für die interaktive Verwendung in J gedacht ist.)Ich hoffe, dass dies in J viel einfacher ist, als ich es aussehen lassen würde.
Bearbeiten: Herausgefunden, wie man das Parsen von Eingaben in J verbessert, Charsub beseitigt, auf Kommandozeilenaufruf und Ausgabe umgestellt.
Edit 2: Eingabe der Zentralfunktion in 3x3 Matrix geändert, viele lästige Klammern entfernt, Namen entfernt
Edit 3: 0-Uhr gehandhabt.
Erläuterung:
Mein J ist immer noch nicht großartig und IO ist ein Schmerz wie immer. Also sind Teile davon verrückt.
1 0 0+{.#:{.&{:+{.#.1 0 0-~1&{
nimmt eine drei mal drei Matrix (bestehend aus den Eingabezeilen, die letzten beiden Elemente sind Müll)1 0 0
)".;._2(1!:1)3
Ruft eine 3-Spalten-Matrix der Eingabe mit 0en an nicht ausgefüllten Positionen ab.,&}.$~,&3 3&{.&{.
Schneidet die erste Zeile von der Eingabe ab und formt die verbleibenden Zeilen in Nx3x3."2
ändert das Zentralverb, um die 3x3-Fälle zu übernehmen.10 10&#:
Gibt 2 Dezimalstellen für jede Zahl aus, die eine Nx3x2-Matrix ergibt. (Nullen für das Auffüllen zu bekommen, war ein Schmerz .),"2":"0
konvertiert die Ziffern in ASCII (Nx3x2x1) und wandelt die letzte Spalte um, wobei Nx3x2 erneut als ASCII angegeben wird.LF,~"1([,':',])/"2
fügt: zwischen jedes Element ein und hängt es an (Nx7) und fügt einen Zeilenvorschub pro für (Nx8) hinzu.4(1!:2)~
druckt jede Zeile.quelle
Haskell, 159 Zeichen
divMod
ist es manchmal nicht wert!foldr
Ansatz zu verwenden (der für Zeitsysteme mit einer beliebigen Anzahl von Komponenten funktioniert!)f
tail
quelle
Rubin, 128 Zeichen
Schamlos kopiert von der Python:
quelle
Haskell - 219 notwendige Zeichen
quelle
PHP (241 Zeichen)
Übernimmt die Eingabe aus einer Datei, die als Argument übergeben wird.
Und ungolfed:
Und nur zur Erinnerung, ohne Siegel (das Dollarzeichen) ergibt dies 205 Zeichen.
quelle
Java,
486371 ZeichenUngolfed-Version: http://pastebin.com/6LiTdGyi
Dies ergibt die gleiche Ausgabe wie in den bereitgestellten Beispielen.
Aber ich bin nicht einverstanden mit diesem Verhalten: Eine Uhr hat nicht so viele Zahlen wie Stunden an einem Tag: Sie hat die Hälfte davon.
Das heißt, wenn Sie 3600 Sekunden zu 12:50:12 addieren, sollte 01:50:12 und nicht 13:50:12 gedruckt werden (in unserem Standardsystem 24/60/60).
Ich habe das in meinem Code behandelt, es aber in meiner Lösung auskommentiert, damit es mit den Beispielen übereinstimmt. Wenn Sie dies berücksichtigen, können die Eingabezeiten natürlich mehrdeutig sein, es sei denn, Sie fügen AM / PM-Marker hinzu.
In jedem Fall hat das Rätsel eine Inkonsistenz: Wenn 00 Stunden durch x ersetzt werden sollen, sollten Stunden> (x / 2) durch Stunden - (x / 2) ersetzt werden.
Edit: Golf Version:
quelle
package
Erklärungen verwenden; 2. nicht verwendenfinal
; 3. Verwenden Sie Variablen- und Klassennamen mit einem Zeichen. 4. Verwenden Sie im Allgemeinen die cleversten Methoden, um den kürzesten Code zu erstellen.int[]c={i(s),i(s),i(s),i(s),i(s),i(s),i(s)}
möchten Sie möglicherweise verwendenint a=i(s),b=i(s),c=i(s),d=i(s),e=i(s),f=i(s),g=i(s)
. Ja, Sie fügen hier 11 Zeichen hinzu, aber Sie sparen jedes Mal drei Zeichenc[x]
, was bedeutet, dass es sich nach 4 solchen Fällen bezahlt macht. Ich habe 13 solcher Instanzen gezählt, was bedeutet, dass Sie insgesamt 28 Zeichen sparen!Bash - 189 Zeichen:
quelle
printf
und zwischen diesen Argumenten sind Leerzeichen erforderlich ...PHP,
229228 ZeichenDie Datei muss als Argument an das Skript übergeben werden
Ungolfed:
Änderungsprotokoll:
229 -> 228: Es muss keine verbleibende Zeit eingestellt werden, während die Stunden geteilt werden
quelle
Bash, 139 Zeichen
quelle
Scala 184 Zeichen:
Im Widerspruch zu den Regeln behaupte ich, dass z
Die Ausgabe sollte nicht sein
aber
und das ist, was mein Code erzeugt. Bitte zeigen Sie mir eine Uhr, die 24:00:00 statt 00:00:00 zeigt - vielleicht 24:59:59. Oder erwarten Sie die Reihenfolge:
anstatt
quelle
Python 2 , 137 Bytes
Probieren Sie es online!
Nur etwas kürzer als die andere Python-Antwort , nimmt aber einen anderen Weg, um dorthin zu gelangen.
Ungolfed Erklärung:
quelle
Haskell (
815624 Zeichen ohne Golf, ohne Leerzeilen)Mine druckt 00:00:00 anstelle von 12:00:00 oder ähnlich für "Mitternacht" -ähnliche Zeiten.Bearbeiten: hat das geändert.Hätte ein paar Dinge mehr abstrahieren können, aber w / e. Es ignoriert die erste Zeile der Eingabedatei vollständig und schreit Sie im Allgemeinen nach falsch formatierten Dateien an.
quelle