Erstaunlicherweise scheint diese einfache Aufgabe noch nicht zu existieren, also ...
Ihre Aufgabe ist es, ein Programm zu schreiben, das eine 12-Stunden-Zeit als Eingabe verwendet und es in "Militärzeit" oder 24-Stunden-Zeitformat umwandelt.
Die Eingabe erfolgt in der Form:
HH:MM am/pm
Obwohl geringfügige Abweichungen zulässig sind:
Der Abstand zwischen vormittags und nachmittags zum Rest der Zeit ist optional.
Der letzte Teil kann entweder "am" / "pm" oder "a" / "p" sein.
Jede Großschreibung ist in Ordnung.
Die Ausgabe ist die eingegebene Zeit, die in das 24-Stunden-Format umgewandelt wird. Es kann eine Zahl oder eine Zeichenfolge sein.
Für die Eingabe und Ausgabe:
Nullen an erster Stelle sind optional. 0 in den letzten 3 Stellen sind Pflichtfelder.
Das Trennzeichen zwischen Stunden und Minuten kann ein ":", "" (ein Leerzeichen) oder nichts sein.
Weitere Hinweise:
Mitternacht kann entweder als 0000 oder 2400 ausgedrückt werden.
Mitternacht gilt als "Uhr", Mittag als "Uhr".
Ihr Programm kann eine Funktion oder ein vollständiges Programm sein und sollte entweder das Ergebnis zurückgeben oder es an die Standardausgabe ausgeben. Nachgestellte Leerzeichen sind in Ordnung.
Beispiele (Sie müssen nicht jedes Format unterstützen):
12:00am -> 0000
1200 pm -> 1200
1234Am -> 00:34
134a -> 134
01:34PM -> 13 34
1234pm -> 1234
Das ist Codegolf, also gewinnt die kleinste Anzahl von Bytes. Da es so trivial ist, dies mit einem eingebauten Code zu lösen, wäre es schön, Code zu sehen, der dies manuell löst (die Verwendung von eingebauten Codes ist jedoch in Ordnung).
Um dies zu verdeutlichen, müssen Sie nicht jedes mögliche Format unterstützen. Es ist in Ordnung, nur ein einzelnes Eingabe- und ein einzelnes Ausgabeformat (Ihrer Wahl) zu unterstützen. Ich möchte jedoch das Format wie oben beschrieben einschränken (was schon ziemlich kostenlos ist). {1134,'pm'}
Zum Beispiel wäre inakzeptabel.
01:54pm
würde funktionieren, aber1:54pm
nicht?Antworten:
V ,
2117 BytesDanke @DJMcMayhem für 4 Bytes!
Probieren Sie es online! Dies übernimmt das Format,
HH:MMx
in demx
entwedera
oder stehtp
, und gibt es im Format zurückHH:MM
Hexdump:
Erläuterung:
quelle
[1-12]
richtig sein? In diesem Fall denke ich , Sie tun können ,ó^12/0
stattcw^R=^R"%12
çp/12^A
das entspricht:g/p/norm 12<C-a>
in vimMATL , 4 Bytes
Probieren Sie es online!
Erläuterung
Eingebaute Funktion: Datumskonvertierung mit automatischer Erkennung des Eingabeformats und des Ausgabeformats
15
, das dem entspricht'HH:MM'
. Dies entspricht der Oktavantwort von @ StewieGriffin .quelle
Oktave,
2117 Bytes4 Bytes dank Luis Mendo gespeichert. Ich könnte statt Format 15 angeben
'HHMM'
.Erläuterung:
Dies ist eine anonyme Funktion eine Zeichenfolge nehmen
c
als Eingabe an das Format:'11:34 AM'
.datestr
Erkennt das Format automatisch als eines der Standard-Datumsformate und gibt es im angegebenen Format 15 ausHH:MM
.Da das angegebene Ausgabeformat nicht über
AM
oderPM
Octave verfügt, wird es automatisch in die von Ihnen als Militärzeit bezeichnete Zeit konvertiert.Probieren Sie es online aus.
Eine Version, die keine
datestr
35 Bytes verwendetErläuterung:
Übernimmt eine Eingabezeichenfolge
c
für das Format1134am
.Oder ein anderer Ansatz für 37 Bytes:
quelle
PowerShell ,
232019 ByteProbieren Sie es online!
(Wenn Sie unter Windows arbeiten, können Sie das weglassen
get-
, um auf 19 Byte zu kommen. Bei TIO ist anscheinend der vollständigeGet-Date
Name erforderlich .)Übernimmt die Eingabe als Zeichenfolge
$args[0]
und verwendet diese als Eingabe für dasGet-Date
Cmdlet, das sie in ein .NET-datetime
Objekt analysiert .-f
Dies wurde mit dem ormat-Parameter übergebenHHmm
, um es in Militärzeit umzuwandeln (die HauptstadtHH
gibt die 24-Stunden-Zeit an). Die Ausgabe ist implizit.Die Parsing-Engine ist ziemlich robust, so dass zusätzliche Eingaben wie
12am
oder12:00am
auch zulässig sind. Spielen Sie mit dem Eingang von TIO und sehen Sie, was sonst noch funktioniert.( 3 Bytes dank @admalledd gespeichert ... ein weiteres Byte dank @briantist gespeichert )
quelle
$args[0]
und-f
, sowie den einfachen Anführungszeichen um das Format str entfernen:date $args[0]-f HHmm
. Zumindest funktioniert das mit meiner PowerShell ...Get-Date
mit-f
jemand mich daran erinnert hat , dass Sie die Anführungszeichen nicht brauchen. Und ein guter Anruf beim Entfernen des Leerzeichens, da der Parser]
das Ende eines Tokens behandelt. Vielen Dank!Python 2, 44 Bytes
Eingabeformat:,
01:23am
optionalm
und Leerzeichen nach MinutenAusgabeformat:
123
quelle
Pyth,
21 bis20 Bytes01 23a
Übernimmt die Eingabe des Formulars als "01:23 Uhr". Die anfängliche 0 ist optional.Die Ausgabe erfolgt in der Form
123
, wobei die anfängliche 0 weggelassen wird.Im Pseudocode:
Probieren Sie es online!
quelle
PHP,
3532 BytesEingabeformat: Groß- und Kleinschreibung beachten, erfordert Doppelpunkt und
m
Ausgabeformathhmm
. Verwendet integrierte Funktionen:Nimmt Eingaben vom ersten Befehlszeilenargument entgegen.
PHP, 45 Bytes, keine eingebauten
Eingabeformat
(h)h:mm a(m)
Kleinbuchstaben, Ausgabeformat(h)hmm
.quelle
JavaScript (ES6), 40 Byte
Die Eingabe sollte wie folgt formatiert sein:
12:32 am
quelle
GNU Coreutils (
18 -16 Bytes)Aus einem Shell-Skript:
Akzeptiert keine Leerzeichen in der Eingabe
In diesem Fall können Sie auch $ 1 verwenden und zusätzliche Argumente ignorieren.
Original
Um Leerzeichen in der Eingabe zuzulassen,
quelle
C #, 46 Bytes
Strings werden wie bei der Eingabe übernommen
12:00 AM
Dasselbe tun, aber die Teilzeichenfolge für die Ausgabe des Standardaufrufs an
ToString
(Angenommen, eine Kultur vonen-GB
) ist 3 Byte länger für 49 Byte:quelle
date
, 0 + 8 = 8 BytesZum Thema "Das richtige Werkzeug für den Job"
Nimmt Eingaben als Befehlszeilenargument. Laufen Sie mit
+%H%M -d
(8-Byte-Strafe). Hier gibt es kein aktuelles Programm. Die gesamte Arbeit wird durch die Befehlszeilenargumente erledigt. (Dies ist eine ziemlich gute Demonstration, warum Befehlszeilenargumente mit einer Strafe belegt werden!)Beispiel:
quelle
Java 7,
138106105104 BytesProbieren Sie es online!
Die Eingabe ist durch Doppelpunkte getrennt und hat ein Leerzeichen zwischen der Uhrzeit und dem Vormittag / Nachmittag. Die Ausgabe ist nicht durch Doppelpunkte getrennt.
-1 Byte dank Kevin Cruijssen
quelle
HHmm
zuHmm
.Japt , 14 Bytes
Probieren Sie es online!
Dies funktioniert nur in Chrome. Hier ist eine Version, die in allen Browsern funktioniert:
Nochmals vielen Dank an ETHproductions für die Hilfe!
quelle
Perl,
452837Bytes2837 Bytes(c / o @Dada)
(36 Byte Code, 1 Byte für Compiler-
-p
Switch)Akzeptiert
0145pm
Typformate mit am / pm oder a / p. Führende Nullen bei Eingaben erforderlich.Prüfung:
Meine ursprüngliche Antwort
(auch sanft überarbeitet)
(39 Byte Code, 1 Byte für Compiler-
-p
Switch.)Akzeptiert nur das Formular wie 0145p oder 0145a und kein anderes und erfordert den
perl -p
Betriebsmodus.Prüfung:
quelle
-p
benötigt wird), wenn Sie die einfachen Anführungszeichen für doppelte Anführungszeichen ändern.s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1
(37 Bytes). Übrigens, Ihre erste Lösung kann ein bisschen heruntergespielt werden:s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e
(40 Bytes)Commodore 64 BASIC, 301 Bytes vor der Ausführung, 321 Bytes werden einmal ausgeführt
Um dies auf einem echten Commodore 64 einzugeben, müssen Sie BASIC-Schlüsselwortabkürzungen verwenden, z. B. LE [Umschalt] F für
LEFT$
, M [Umschalt] I fürMID$
usw., oder Sie können CBM PRG STUDIO ausprobieren.Die
TI$
Variable in Commodore BASIC zeigt die Uhrzeit beim Drucken im 24-Stunden-Format als HHMMSS an. Wenn Sie den Speicherplatz nach der Zeilennummer löschen, wird kein Speicherplatz gespart, da Commodore BASIC den Speicherplatz ohnehin automatisch hinzufügt, wenn Sie das Programm nach der Eingabe auflisten.Beim Konvertieren einer Zahl in eine Zeichenfolge mit
STR$
fügt Commodore BASIC das Leerzeichen ein (wenn Sie alsoPRINT A
ein Leerzeichen sehen, bevor die Zahl angezeigt wird), habe ich das Leerzeichen für die Konvertierung der Zahl in eine Zeichenfolge mit demRIGHT$
Befehl entfernt. Sie könnten ein paar Bytes sparen, indem Sie die Zeile Null wie folgt ändern:Daher müssen Sie Ihre Konvertierungszeit wie folgt angeben, bevor Sie das Programm ausführen können:
Zu jedem späteren Zeitpunkt können Sie die aktuelle Uhrzeit anzeigen mit:
quelle
Java, 171 Bytes
Eingabeformat ist
HH:MM a/p
und Ausgabeformat istHHMM
. Missbrauch der Tatsache, dass die Hauptfunktion über eine Reihe von Zeichenfolgen verfügt, um die Eingabe in drei Abschnitte zu unterteilen: Stunde, Minute und A / P-Anzeige.Beispiel für Ein- und Ausgabe:
Ungolfed-Version:
quelle
enum
Früher hatte ich das nicht gesehenmain
. Schön :)REXX, 33 Bytes
Verwenden:
Dies könnte um einige Bytes verkürzt werden, wenn kein Doppelpunkt als Begrenzer verwendet wird.
quelle
C (clang) 94 Bytes
Probieren Sie es online!
Ich bin hier, um zu lernen, also sind alle Tipps, wie ich den Code optimieren kann, willkommen.
@ Johan du Toit Danke, dass du ein paar Bytes gespart hast!
quelle
printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
C,
8772 BytesDank @Johan du Toit 15 Bytes gespart
Rufen Sie
f()
mit einer veränderlichen Zeichenfolge als Argument auf, die Eingabe ist die Ausgabe.Das Format lautet
HH:MMa/p
, wobeia/p
entweder Kleinbuchstabena
oder Kleinbuchstaben verwendet werdenp
. Zwischen der Zeit und dem Meridian-Spezifizierer ist kein Leerzeichen zulässig.Probiere es auf ideone aus .
quelle
i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
(p[5]!=97)*12;
stattdessen vor(p[5]^97?12:0);
TCL, 45
47Jetzt mit einem eingebauten:
Testbar unter http://rextester.com/TSRXI8802, wo es ein Skript gibt, das es von 01:00 bis 12:00 Uhr ausführt
quelle
SmileBASIC, 67 Bytes
Eingang:
HH:MMa/p
Ausgabe:
HH MM
quelle
R, 68 Bytes
Liest Eingaben von stdin und es wird angenommen, dass sie in einem der folgenden Formate vorliegen:
12:00 AM
12:00 am
12:00AM
12:00am
und die Ausgabe erfolgt im Format:
[1] "00:00"
In den meisten Fällen erfolgt die
strptime()
Ausgabe im Format:"2017-01-06 12:00:00 CET"
wobei das Datum das lokale Datum ist. Als solches müssen wir verwenden,substr()
um nur die Zeit zurückzugeben. Wenn die Eingabe jedoch Mitternacht ist (z. B.12:00am
), ist die Ausgabe nur"2017-01-06 CET"
der Grund für dieif
Sache am Ende (es muss eine geschicktere Problemumgehung geben).quelle
lubridate
, aber der Name des Pakets ist zu lang (neben anderen Problemen).C
159152 BytesEingabeformat:
07:30am
quelle
Pyke, 15 Bytes
Probieren Sie es hier aus!
quelle
Mathematica, 33 Bytes
Anonyme Funktion. Nimmt einen String als Eingabe und gibt einen String als Ausgabe zurück. Funktioniert mit den meisten Formaten, einschließlich
hh:mm AM/PM
.quelle
JavaScript, 67 Byte
Die Eingabe erfolgt wie im Beispiel
quelle
12:00 am
oder12:00 pm
Haskell, 61 Zeichen
Kurzfassung:
Eingabeformat:
HHMM(a/p)
Dabei(a/p)
steht entweder 'a' oder 'p' ohne Klammer.Ausgabeformat:
(hs, MM)
- Ein Tupel, das die Stunden als Ganzzahl und MM als Zeichenfolge enthält.Beispiel:
Längere Version (mit nützlicheren Namen und einer Ersetzung
hs
):quelle
Common Lisp (
151122 Bytes)OK, CL soll nicht "knapp" sein, aber ich bin nur überrascht, dass es für dieses nicht die ausführlichste ist.
Hier ist die 122-Byte-Version, die eine Eingabe mit fester Position erfordert.
0145pm
oder145p
sind akzeptabel (mit dem führenden Leerzeichen an der ersten Zeichenposition).PPRINT:
Schöner aber größer
Verwenden Sie nur das
Common-Lisp
Paket. Akzeptiert (nur) Eingaben in Form von ganzen Stunden (mit oder ohne Führung0
), Literalen:
, zweistelligen Minuten und optionalem Nachstellenam
oderpm
(nur in Kleinbuchstaben). Erlaubt Leerzeichen um die Uhrzeit und um die AM / PM, jedoch nicht direkt nach dem:
.Prüfung:
pprint
die Funktionsdefinition:Enttarnt:
quelle
Retina ,
61-60BytesDie Eingabe erfolgt ohne trennenden Doppelpunkt, obligatorisches Anführen
0
und unter Verwendung von nura
oderp
anstelle vonam
oderpm
, z0134a
. B. um 01:34 Uhr. Ausgabe in reiner Militärzeit mit 0000 als Mitternacht. (Ich könnte ein paar Bytes einsparen, wenn ich zum Beispiel 12:30 Uhr in konvertieren darf2430
, aber ich bezweifle, dass das akzeptabel ist).Probieren Sie es online!
Erläuterung
Die ersten beiden Fälle befassen sich mit den "12" Stunden, da am / pm für 12 umgekehrt ist:
Wenn die Zeit zwischen Mitternacht (12 Uhr) und 1 Uhr morgens liegt, ändern Sie sie auf 00 anstelle von 12 Uhr und entfernen Sie die
a
.Wenn die Zeit zwischen 12.00 Uhr und 13.00 Uhr liegt, entfernen Sie das p, um einfach die 24-Stunden-Zeit zu erhalten.
Für jede andere Stunde:
Wenn die Zeit abgelaufen ist, entfernen Sie einfach die
a
, um die 24-Stunden-Zeit zu erhalten.Wenn die Uhrzeit pm ist, entfernen Sie die
p
. Konvertieren Sie die Stundenkomponente in unär, addieren Sie 12 und konvertieren Sie zurück in dezimal. Lassen Sie die Minuten unverändert.quelle
Batch, 40 Bytes
Nimmt die Eingabe als drei Argumente. Angenommen, das zweite Argument hat eine führende Null, wenn nötig, das dritte Argument ist entweder
a
oderp
. Behandelt das dritte Argument als indirekten Variablennamen und addiert es daher zur Anzahl der Stunden. Die Anzahl der Minuten bleibt davon unberührt und wird direkt ausgegeben. Wenn das Mischen verschiedener Formate in Ordnung ist, kann der letzte Speicherplatz gelöscht werden, um ein Byte zu speichern.(Ziemlich ärgerlich, dass diese Frage nicht auf der Fragenseite angezeigt wurde, als ich sie ursprünglich geladen habe, und ich bin nur darauf gestoßen, weil ich nach einer anderen Frage gesucht habe.)
quelle