Da heute der Anlass für die 26. Schaltsekunde aller Zeiten ist, besteht Ihre Herausforderung darin, das Datum und die Uhrzeit jeder Schaltsekunde in GMT oder UTC auszugeben, die bisher aufgetreten ist, sowie diejenige, die heute auftritt.
Eingang
Es erfolgt keine Eingabe.
Ausgabe
1972-06-30 23:59:60
1972-12-31 23:59:60
1973-12-31 23:59:60
1974-12-31 23:59:60
1975-12-31 23:59:60
1976-12-31 23:59:60
1977-12-31 23:59:60
1978-12-31 23:59:60
1979-12-31 23:59:60
1981-06-30 23:59:60
1982-06-30 23:59:60
1983-06-30 23:59:60
1985-06-30 23:59:60
1987-12-31 23:59:60
1989-12-31 23:59:60
1990-12-31 23:59:60
1992-06-30 23:59:60
1993-06-30 23:59:60
1994-06-30 23:59:60
1995-12-31 23:59:60
1997-06-30 23:59:60
1998-12-31 23:59:60
2005-12-31 23:59:60
2008-12-31 23:59:60
2012-06-30 23:59:60
2015-06-30 23:59:60
Regeln
Da ich bezweifle, dass es viele integrierte Funktionen gibt, die Schaltsekunden erlauben, werde ich sie zulassen.
Standardlücken sind nicht zulässig.
Kürzester Code gewinnt.
Das Datumsformat muss einen mit Nullen aufgefüllten Monat und ein vierstelliges Jahr sowie eine militärische Zeit und ein Leerzeichen enthalten, das die Zeit vom Datum trennt. Das Setzen UTC
am Ende ist optional. Ihre Wahl der Gedankenstriche oder Schrägstriche.
EDIT: Ja, wie vorhergesagt, wurde dies eine Herausforderung für die Codierung. Wenn nur die Codierung das Schaltsekundenproblem beheben könnte, ... wäre unser gesamter Code viel praktischer. Vielleicht brauchen wir ein paar Ideen für lustige Herausforderungen mit praktischen Einsätzen?
quelle
Antworten:
CJam,
72706964 BytesProbieren Sie es online im CJam-Interpreter aus .
Idee
Wir beginnen mit der Codierung jede Schaltsekunde als 2 · (Y - 1972) + D , wobei D sind 1 , wenn es im Dezember und tritt 0 sonst.
Das Array aller codierten Schaltsekunden lautet:
Nennen wir dieses Array L .
Da das Array aufsteigend sortiert ist, können wir die aufeinander folgenden Differenzen anstelle der tatsächlichen Zahlen speichern:
Wenn Sie dieses Array als die Ziffern einer Zahl zur Basis 15 behandeln, erhalten Sie die Ganzzahl
welche Ziffern in der Basis 240 (in Zeichen umgewandelt) sind
Code
quelle
R
7875 BytesEingebaute, sagst du? Gut...
R hat eine automatische Variable,
.leap.seconds
die das Datum und die Uhrzeit jeder Schaltsekundeneinfügung enthält, angegeben in der Ortszeit des Systems. Ab R-Version 3.2.0 ist dies heute nicht mehr enthalten, daher habe ich das manuell hinzugefügt.Ungolfed + Erklärung:
Sie können es online ausprobieren !
quelle
HTML, 594 Bytes
¯ \ _ (ツ) _ / ¯
quelle
working
HTML-Codecode golf
.C
160,146,141,140 BytesErstmaliges Posten, nicht sicher, was "Standardlücken" sind. Ich habe natürlich Druckwarnungen.
160 Bytes:
Die ursprüngliche Idee ist, Schaltsekunden mit zwei Bits pro Jahr zu codieren: eine für Juni und eine für Dezember. Die Codierung wird jeweils ein Bit von der inneren while-Schleife verbraucht. Ohne eine 128-Bit-Ganzzahl ist die äußere while-Schleife erforderlich. Der Rest ist alles Buchhaltung und Mathe. :-)
141 Bytes:
Durch Anwenden der vorgeschlagenen Tipps werden 146 Byte erreicht. Dann habe ich einen Weg gefunden, die äußere while-Bedingung (von Y <2000 bis nur Z) zu vereinfachen und auf 141 Bytes zu reduzieren. So nah an einem Tweet!
140 Bytes:
Ich bemerkte, dass der Gedankenstrich im Datum beseitigt werden konnte, indem der Tag negativ gemacht wurde. Kann es mit dem Monat auch nicht schaffen, da es im Juni eine führende Null gibt. Aber zumindest passt es jetzt in einen Tweet!
Hübsche Version:
Bonusversion:
Ich habe die äußere Schleife beseitigt, indem ich eine 64-Bit-Ganzzahl in eine andere verschoben habe, aber es sind 150 Bytes, aufgrund der ziemlich langen "vorzeichenlosen langen Länge". Wenn ich etwas wie "uint64" verwenden könnte, wären es 138 Bytes.
quelle
for
Schleife werden einige Bytes gespart. Übrigens,int main()
->main()
. Sie finden dies möglicherweise sehr hilfreich.X>>=1
ist dasselbe wieX/=2
,6*(2-Z)
ist dasselbe wie12-6*Z
und4362608640
ist ein Byte kürzer als0x104082000
. Dasint
vormain()
ist nicht erforderlich, und wenn Sie zu wechselnmain()
,main(Z)
können Sie die Deklaration entfernenZ=1
.if(X&1)printf(...);
mitX&1?printf(...):1;
der 1 Byte gespart wirdwhile(X){...}
Kommas zu verwenden, können Sie die geschweiften Klammern entfernenwhile(X)X&1?printf("%d-%02d-%d 23:59:60\n",Y,6*(2-Z),31-Z):1,Y+=Z^=1,X>>=1;
und weitere 2 BytesPython 3, 91
Verwendet die Codierung und Zeichenfolgenformatierung von Sp3000 , speichert die Werte jedoch in einem Python 3-Byte-Objekt und nicht in einer magischen Zahl.
Die Codierung benötigt nur 86 der 256 möglichen Werte eines Bytes, daher wird ein Bereich druckbarer Zeichen verwendet, um das Erscheinungsbild zu verbessern.
quelle
Brainfuck, 806
Sie können es auf diesem Online-Interpreter ausführen.
quelle
Python 2,
111104 BytesBasiscodierung und mehr Basiscodierung.
quelle
GNU sed + date: 112
Gängige Linux-Distributionen haben ebenfalls die Schaltsekunden eingebaut. Verwendung von GNU sed und date:
GNU sed + Datum: 90
Ein paar Zeichen sichern, indem der Pfad gekürzt wird:
GNU sed + date von Toby Speight: 84
Tiefgolf-Version in den Kommentaren vorgeschlagen:
quelle
date
(GNU 8.23) diese als erste Sekunde der nächsten Minute an. Was verwenden Sie, das die 60-Sekunden-Minute versteht?-r
Flag, unter Substitutiondate
in dems///e
Modifikator und Ersetzen%Y-%m-%d
mit%F
indate
: TZ = UTCsed -nr 's/^([0-9]+).*/date -d "1900-1-1 \1sec" "+%F %T"/ep' /u*/s*/z*/leap*
1899-12-31 \1sec
für das Datum und die Hardcodierung23:59:60
als Uhrzeit verwendete:sed -nr 's/^([0-9]+).*/date -d "1899-12-31 \1sec" "+%F 23:59:60"/ep' /u*/s*/z*/leap*
JavaScript ( ES6 ) 125
Der Zeilenumbruch innerhalb von `` ist signifikant und wird gezählt.
Führen Sie zum Testen das folgende Snippet aus (nur EcmaScript 6, Firefox).
quelle
PHP, 198 Bytes
Leider weiß ich nicht, ob ich
\n
in die Datumsfunktion einfügen kann . Wenn ja, ist dies wegen 3 Bytes weniger.""
.quelle
(int)
entfernen und Leerzeichen entfernen. Datum wirft einen Fehler aus. Wenn die Standard-Zeitzone nicht festgelegt ist, schalten Sie sie mit einem ab@
. 187 Bytes:foreach([.5,1,2,3,4,5,6,7,8,9.5,10.5,11.5,13.5,16,18,19,20.5,21.5,22.5,24,25.5,27,34,37,40.5,43.5]as$d){$h=$d-ceil($d);echo@date("Y-m-d 23:59:60",mktime(0,0,0,-6*$h,31+$h,$d+1972))."\n";}
8086 Maschinencode + DOS, 92 Bytes
Hexdump des Codes:
Schreiben Sie zum Ausführen die 92 Bytes in eine
com
-Datei und führen Sie sie unter 32-Bit-Windows oder DOSBox aus.Der Code verwendet eine Bitmap mit 87 Bits, eine pro halbes Jahr. Die Bits sind ausgehend von MSB in Gruppen von 16 angeordnet.
Bitmap dekodieren:
Aufgrund der Codestruktur gehen beim Dekodieren einige Bits verloren, so dass ich sie wiederholen musste. Durch diese Wiederholung wird die Bitmap nicht aufgebläht, da ich sowieso 87 Bit bis 96 Bit auffüllen musste.
Nach dem Drucken (oder Nicht-Drucken) der Schaltsekunde erhöht der Code das Datum um ein halbes Jahr, indem er die ASCII-Codes der ausgegebenen Nachricht bearbeitet.
Quellcode (zusammenstellbar mit
tasm
):quelle
Pyth -
8884 BytesKonvertiert in ein Zeichen, um die Daten zu komprimieren, und speichert die
06-30
Versus-12-31
Daten als Binärzahl.(dort ist am Ende ein Leerzeichen)
Probieren Sie es hier online .
quelle
Python 2,
123121116114111Ich habe es geschafft, es ziemlich kurz zu machen, aber ich bin mir nicht sicher, wie viel kürzer es werden kann. Ich habe versucht, mit
exec
, aber die Formatierung wird zu teuer.Ich habe eine Base-16-Codierung der Tabelle von der verknüpften Wikipedia-Seite verwendet.
Bearbeiten: Verwenden von Hex-Codierung ist kürzer als Basis 36 (siehe die weniger Golf-Version.)
Probieren Sie es hier aus
Weniger golfen:
quelle
C
155,149,147 BytesHier ist ein weiterer Ansatz in C, bei dem Zeichenfolgen und Lauflängencodierung verwendet werden. Nicht ganz so knapp wie meine andere C-Lösung, aber vielleicht kann sie verbessert werden?
155 Bytes:
Verwenden Sie eine Zeichenfolge, um den Monat / Tag zu halten.
149 Bytes:
Beseitigen der Monats- / Tageszeichenfolge.
147 Bytes:
Eliminierung der Jahresinitialisierung.
144 Bytes:
Wenn ich den Puffer neu verschlüsselt habe, damit die Anzahl der Auslassungen vor (nicht nach) dem Lauf angewendet wird, könnte ich die Anweisungen in der äußeren while-Schleife neu anordnen, den Kommaoperator verwenden und die geschweiften Klammern entfernen und 2 Bytes einsparen.
Ich kann ein weiteres Byte speichern, indem ich den Tag negativ schreibe (wie bei meiner anderen Lösung).
Ziemlich:
Erläuterung:
Läufe werden in Bytes codiert. Jedes Byte hat ein Bit, das angibt, ob es sich um Juni oder Dezember handelt, 3 Bits für eine Längenzählung, 3 Bits für eine Sprungzählung und 1 nicht verwendetes hohes Bit.
Die Anzahl der zu überspringenden Jahre ist die Anzahl der Jahre, die nach einem Durchlauf übersprungen werden müssen. Es ist um -1 versetzt, um 1972 zwei Schaltsekunden zu ermöglichen. Die Länge ist wie viele Jahre in einem Lauf; es könnte wahrscheinlich um +1 versetzt werden, ist es aber derzeit nicht.
Ein Byte bedeutet also: "Machen Sie LÄNGENJAHREN (oder DEZEMBER) Schaltsekunden und überspringen Sie dann SKIP-1 Jahre", bevor Sie mit dem nächsten Byte fortfahren.
Die Bytes sind um 33 versetzt, um sie lesbar zu machen und um eine ausgefallene Codierung zu vermeiden.
Das heißt, wir haben zwar genügend Sprungbits, um 1998-2005 abzudecken, aber wir befinden uns außerhalb des ASCII-Bereichs, sodass wir einen zusätzlichen Lauf mit der Länge Null haben. 1979 erscheint auch für sich allein, weil die Länge 1972-1979 zu lang ist.
Die Bytes enthalten genügend Bits, sodass diese Probleme möglicherweise endgültig behoben werden können.
quelle
q / kdb +,
959493 BytesErläuterung
Codieren Sie für jedes Jahr + 1 für Jahre seit 1905 als ASCII-Zeichen, z.
6h$x
dreht sich"D"
zurück zu68
. Daq
die Datumsepoche ist2000.01.01
, subtrahieren wir95
die Ganzzahl-zu-Datum-Konvertierung und führen sie durch"d"$"m"$-12*95-6h$x
.Der Grund, warum wir oben +1 geben, ist, die Anzahl der Tage vom Beginn des nächsten Jahres zu subtrahieren , um den 31. Dezember oder 30. Juni des aktuellen Jahres zu erhalten , nämlich 1 oder 185 Tage. Daher steht
"DEFGHIJKSUV[^eh"
die Jahreszahl mit einer Schaltsekunde im Dezember und"DMNOQXYZ]lo"
für die im Juni. Die Pairing-Subtraktion erfolgt über(a;b){x-y}'(c;d)
, wobeia
undb
sind die Jahre, die jeweils umc
und died
Anzahl der Tage subtrahiert werden ." "0:([]...)
bereitet die Ergebnisse so auf, dass wir die richtige Formatierung erhalten, mit einer kleinen Einschränkung, dass eine Spaltenüberschrift generiert wird.1_
löscht diesen Header und wendet ihn schließlichasc
an, um die richtige Reihenfolge zu erhalten.edit : 're-base' um 95 Jahre anstatt 100 zu subtrahieren (1 Zeichen wird gespeichert).
edit 2 : Die Positionierung der Operanden innerhalb der Funktion zur Konvertierung von Ganzzahlen auf Datum neu anordnen.
quelle
Python,
204201Du kannst damit auf repl.it spielen .
Edit: Gründlich geschlagen! Die Kompressionsantworten sind erstaunlich kurz.
quelle
PHP, 164 Bytes
Dies ist nur eine kleine Änderung der Idee von @ Voitcus
quelle
Python,
221217Einige Einblicke
Grundsätzlich
d(x)
dekomprimiert einen Vektor von ganzen Zahlen 3 von einer einzigen 2-stellige ganzen Zahl ist .d(x)
wird als die Umkehrfunktion (über die 26 Schaltsekunden-Datenzeiten) von konstruiertc(v)
, die wiederum eine Komprimierungsfunktion ist, die ein 3-uple wie (1998, 12, 31) in eine Zahl wie 85 umwandelt. Um die Liste abzuleiten [20 , 21 ... 28,58] Ich habe einen anderen Algorithmus entworfen, um zu überprüfen, ob die Komprimierungsfunktion über die Domäne bijektiv ist. Das heißt, ich habe sichergestellt, dass das folgende Programm keine Duplikate erzeugt, und ich habe seine Ausgabe als Liste des obigen Programms verwendet.Die Komprimierungsfunktion
c(v)
wurde unter Verwendung eines sehr einfachen Schemas als bijektiv konzipiert. Nehmen wir als Beispiel (1998, 12, 31).Ich habe das Programm geschrieben, um zu überprüfen, ob dies wahr ist, und dann habe ich es
d(x)
als das Gegenteil von definiertc(v)
. In unserem Beispiel wird c ((1998,12,31)) mit 85 und d (85) korrekt gedruckt1998-12-31 23:59:60
.quelle
q=x%10
und Ersetzenq
mitx%10
überall. Es ist kürzer. Ich gebe auch eine hilfreiche Beschreibung von einigen zusätzlichen Golf auf Ihrem Programm hier . Ich empfehle, die Seite Tipps zum Golfen in Python zu lesen.gzip, 114 bytes
Hexdump:
1f8b080853f9975502006c006dd04b0a80300c84e1bde01dbc40218fa6697aff8309e2a6fa6f3f86cc10adb426a3b95ce62b6a0d398f07d59aeb8e4ed80983701026e1242cc0a9307e1aa11306615211b59710527b3961270cba9994fc7fc944829092faeedc313e7803993cfafb20020000
Erstellen Sie eine Datei mit den oben beschriebenen Bytes.
Mit gunzip oder einem anderen Dekomprimierungsprogramm extrahieren, um eine neue Datei mit dem Namen "l" zu erhalten. Diese Datei enthält die gewünschte Ausgabe.
quelle