Wann wird der Brexit stattfinden?

27

Nun, Brexit ist passiert . Und Sky News, die Genies, die sie sind, haben beschlossen, einen Countdown an der Seite eines Busses zu starten.

Bildbeschreibung hier eingeben

Ihre Aufgabe ist es, etwas Ähnliches zu tun. Großbritannien verlässt die EU am 31. März 2019 und Sie müssen dafür einen digitalen Countdown erstellen, der sich jede Sekunde ändert (wobei eine Abweichung von 0,05 Sekunden zulässig ist).

Eingang

Ihr Programm sollte absolut keine Eingabe nehmen. Es ist verboten!

Ausgabe

Es sollte die Zeit bis zum Brexit im Format ausgeben ddd:hh:mm:ss. Führende und nachfolgende Zeilenumbrüche sind zulässig, die Anzeige sollte jedoch jedes Mal an derselben Stelle bleiben. Es sollte so aussehen, als ob es tatsächlich abnimmt. Wie von @AnthonyPham hervorgehoben, bedeutet dies nicht, dass genügend Zeilenumbrüche gedruckt werden, um den Bildschirm zu "löschen". Dies bedeutet, dass Sie den Bildschirm tatsächlich löschen müssen.

Eine Ausgabe wie diese ist nicht erlaubt:

100:20:10:05
100:20:10:04

Das ist es auch nicht

100:20:10:05
*A thousand newlines*
100:20:10:04

da sie in mehr als einer Zeile stehen.

Sie müssen sich nach dem Brexit keine Sorgen mehr machen. Ihr Programm muss nur bis zum 31.3.19 funktionieren

Regeln

  • Standardlücken sind nicht zulässig
  • Das ist also gewinnt der kürzeste Code in Bytes .
  • Fehlermeldungen (obwohl ich mir nicht vorstellen kann, wie) sind nicht zulässig
  • Der Code sollte innerhalb von 2 Jahren ausgeführt werden können (wenn das Vereinigte Königreich die EU verlässt) und sollte die aktuelle Zeit anzeigen und nicht erneut ab 730 beginnen (siehe unten).

Countdown-Regel

Der Countdown sollte nicht fest programmiert sein und jederzeit ausgeführt werden können, bevor der Brexit abgeschlossen ist, und dennoch das richtige Ergebnis liefern. Wenn ein neuer Tag beginnt, sollte die Stunde dem folgenden Format entsprechen

712:00:00:01
712:00:00:00
711:23:59:59

Lassen Sie mich noch einmal sagen, das Datum, an dem der Brexit endet, ist der 31.3.19 um Mitternacht (31: 3: 19 00:00:00 oder 31: 3: 2019 00:00:00 oder jedes andere gewünschte Format)

NB: Ich glaube, ich habe alles, aber ich habe es nicht in der Sandbox gepostet, sonst hätte das Timing falsch sein können. Zögern Sie nicht, Verbesserungsvorschläge zu veröffentlichen, da diese nicht perfekt sind.

Caird Coinheringaahing
quelle
Kann ich es jede Millisekunde ausführen und trotzdem jede Sekunde eine Aktualisierung anzeigen? Dies dient nur dazu, meinen Code zu verkürzen.
David Archibald
@DavidArchibald sagt nur, dass sich die Anzeige jede Sekunde ändern muss. Es ist nur so, dass die meisten Antworten es einfacher finden, jede Sekunde zu laufen.
Caird Coinheringaahing
ahh. Nun, ich muss sagen, 1000wenn ich will, dass es sich einmal pro Sekunde ändert. Vielen Dank
David Archibald
Sind führende Nullen erforderlich?
Shaggy
1
Mitternacht welche Zeitzone: UCT oder GMT? Müssen wir das berücksichtigen?
Titus

Antworten:

12

JavaScript, 134 129 113 Bytes

setInterval("d=-new Date;document.body.innerHTML=`<pre>${d/864e5+17986|0}:`+new Date(d).toJSON().slice(11,19)",1)

Bearbeiten: 2 Bytes dank @Shaggy gespeichert. 11 Bytes dank @ l4m2 eingespart.

Neil
quelle
Hat es geschafft, Sie @Neil zu schlagen ... um ein paar Bytes.
David Archibald
Warum nicht benutzen <a id=0>? Oder etwas ähnliches?
Solomon Ucko
3
Oder auch document.body.innerHTMLstatto.innerHTML
cloudfeet
1
Ich wollte, dass es monospace ist, um sicherzustellen, dass die Anzeige an derselben Stelle bleibt, aber ich denke, ich könnte ein Byte speichern und verwenden <tt>.
Neil
3
Sie könnten 2 Bytes einsparen, indem Sie den Code jede Millisekunde (oder 2 oder 3 ...) ausführen.
Shaggy
11

PowerShell, 70 63 55 53 Bytes

Ausgeschlossene Anführungszeichen, einfach -2 dank @Joey

for(){cls;(date 31Mar19)-(date)|% T* ddd\:hh\:mm\:ss}

Wenn Sie dies mit Schlafmodus ausführen, werden 8 Byte hinzugefügt, aber die Eingabe ist meistens unsichtbar, wenn sie ohne diese ausgeführt wird. Version (63 Byte) mit Schlafmodus:

for(){cls;(date 31/3/19)-(date)|% T* ddd\:hh\:mm\:ss;sleep 1}

for() ist eine Endlosschleife, und innerhalb dieser Schleife ..

cls um den Bildschirm zu löschen,

Holen Sie sich 31/3/19als DateTimeObjekt und -das aktuelle Datum daraus, um die verbleibende Zeit anzugeben, dann .ToString()( |% T*) das mit dem richtigen Format.

Dies zeigt eine negative Zeit nach dem Brexit an.

colsw
quelle
Dies ist auch abhängig vom lokalen Datumsformat. Obwohl das britische TT / MM / JJ-Format angemessen ist, wird es auf US-Computern nicht so wie es ist ausgeführt. Ich bin gespannt wie das T*funktioniert. Das kenne ich nicht.
Joel Coehoorn
@JoelCoehoorn Es ist ein netter Trick, der %foreach nimmt tatsächlich das ToString-Objekt auf und akzeptiert den nächsten String als Argument. Was das Datum / Uhrzeit-Format betrifft, warum läuft es nicht auf US-Maschinen? Ich dachte, die ddetc waren kulturunempfindlich.
Colsw
Es wird versucht, den 31. Monat auf meinem Computer zu finden. Funktioniert gut, wenn ich es ändere 3/31/19. Würde auch 2019-03-31überall funktionieren , aber das kostet dich ein paar Bytes.
Joel Coehoorn
@JoelCoehoorn ah richtig - sorry ich habe über die Ausgabe nachgedacht, aktualisiert auf 31Mar19anstatt 31/3/19welche sollte es hoffentlich beheben?
Colsw
1
Sie können die Anführungszeichen um die Formatzeichenfolge verlieren, da die Befehlsargumentanalyse angewendet wird.
Joey
7

Excel VBA, 91 84 82 Bytes

7 Byte gespart dank JoeMalpass, der darauf hinweist, dass Excel Datumsangaben als Zahlen ansieht.
2 Bytes gespart dank JoeMalpass

Sub b()
Do
t=CDec(43555-Now)
Cells(1,1)=Int(t) &Format(t,":hh:mm:ss")
Loop
End Sub

Die Ausgabe erfolgt in eine Zelle A1in der aktiven Excel-Tabelle.

Ingenieur Toast
quelle
-6 Bytes durch Tauschen ("2019-3-31")mit (43555). Wenn ich dies jedoch in Excel versuche, friert es nach ca. 5-6 Sekunden ein ...
CactusCake
1
@ JoeMalpass Danke, das ist ein guter Punkt. Es sieht auch für mich nach ein paar Sekunden aus, weil es viel schneller als 1 / Sekunde berechnet. Das Hinzufügen von Verzögerungen fügt jedoch Bytes hinzu und das OP sagt nicht, dass es in der Lage sein muss, von nun an bis zum Brexit kontinuierlich herunterzuzählen, ohne etwas in Brand zu setzen.
Ingenieur Toast
Anscheinend Nowfunktioniert auch ohne ()...
CactusCake
6

Python 3.6, 146 Bytes

from datetime import*
x=datetime
while 1:d=x(2019,3,31)-x.now();s=d.seconds;a=s%3600;print(end=f"\r{d.days:03}:{s//3600:02}:{a//60:02}:{s%60:02}")
ovs
quelle
5

C #, 173 172 156 150 127 Bytes

using System;class P{static void Main(){for(;;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:d\\:hh\\:mm\\:ss}  ");}}

16 Bytes dank @Bob gespeichert 6 Bytes dank @ Søren D. Ptæus gespeichert

Formatierte Version:

using System;

class P
{
    static void Main()
    {
        for (;;)
            Console.Write($"\r{new DateTime(2019, 3, 31) - DateTime.Now:d\\:hh\\:mm\\:ss}  ");
    }
}
TheLethalCoder
quelle
Schaffst du das (TimeSpan)0? Kann momentan nicht telefonisch testen. Sie können das Clear trotzdem fallen lassen, da der Wagenrücklauf sich darum kümmert: Er setzt den Cursor wieder an den Anfang der Zeile.
Bob
2
Gedanke: Wenn sich die Länge ändert (weniger als 100 Tage), könnte es scheitern, sich auf die CR zu verlassen. Behebung: Fügen Sie am Ende zwei zusätzliche Leerzeichen hinzu.
Bob
@ Bob Ich habe vergessen, die zu entfernen Clear! Wie dumm von mir. Und nein, ich kann nicht konvertieren int, TimeSpanich habe es bereits versucht.
TheLethalCoder
Sie können 6 Bytes beim Schreiben sparen (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Søren D. Ptæus
@ SørenD.Ptæus Gute Idee, nicht einmal daran gedacht
TheLethalCoder
4

JavaScript ES5, 320 319 316 305 295 284 Bytes

setInterval(function(){a=Math,b=a.floor,c=console,d=Date,e="00",f=new d(2019,2,31),g=a.abs(f-new d)/1e3,h=b(g/86400);g-=86400*h;var i=b(g/3600)%24;g-=3600*i;var j=b(g/60)%60;g-=60*j,c.clear(),c.log((e+h).slice(-3)+":"+(e+i).slice(-2)+":"+(e+j).slice(-2)+":"+(e+a.ceil(g)).slice(-2))})

Vielen Dank an @Fels für die Referenzierung Math, @dgrcode für die Referenzierungconsole

Nicht golfen

setInterval(function() {

  var math = Math, floor = math.floor, c = console, d = Date;

  var leadings = "00";

  // set our brexit date
  var brexit = new d(2019, 2, 31);

  // get total seconds between brexit and now
  var diff = math.abs(brexit - new d()) / 1000;

  // calculate (and subtract) whole days
  var days = floor(diff / 86400);
  diff -= days * 86400;

  // calculate (and subtract) whole hours
  var hours = floor(diff / 3600) % 24;
  diff -= hours * 3600;

  // calculate (and subtract) whole minutes
  var minutes = floor(diff / 60) % 60;
  diff -= minutes * 60;

  // what's left is seconds

  // clear the console (because OP said it must print in the same place)
  c.clear();

  // log the countdown, add the leadings and slice to get the correct leadings 0's
  c.log((leadings + days).slice(-3) + ":" + (leadings + hours).slice(-2) + ":" + (leadings + minutes).slice(-2) + ":" + (leadings + math.ceil(diff)).slice(-2));

});

cnorthfield
quelle
2
Sie können ein bisschen meine Umbenennung in Mathe wieg=Math;
Fels
Aliasing Mathkann anscheinend immer noch 2 Bytes einsparen, oder?
Marie
Sie können ein bisschen mehr sparen, indem Sie Pfeilfunktionen verwenden und loswerden var. Wählen Sie auch kürzere Namen für Variablen, z. B. hanstelle von hoursoder manstelle von minutes. Wahrscheinlich c=consolewerden dadurch ein paar Bytes mehr gespart. Auch 1e3anstelle von1000
Daniel Reina
4

PHP, 84 Bytes

for(;$c=DateTime;)echo(new$c('@1553990400'))->diff(new$c)->format("\r%a:%H:%I:%S ");

Ziemliech direkt. 1553990400 ist der Zeitstempel für den 31-3-2019 00:00:00 in UTC. Mit DateTime-> diff () -> format () wird eine Endlosschleife ausgeführt, um die verbleibende Zeit auszugeben. Nach dem Brexit wird von 0 aufwärts gezählt.

Kommentierte / besser lesbare Version:

// Infinite loop, assign DateTime (as a string) to $class
for (; $class = DateTime;) {
    echo (new $class('@1553990400')) // Create a new DateTime object for the brexit date/time.
            ->diff(new $class) // Caulculate the difference to the current date/time.
            ->format("\r%a:%H:%I:%S "); // Format it according to the specification, starting with a \r character to move to the start of the line and overwrite the previous output.
}
Chocochaos
quelle
Neu hier und kurz davor, meine eigene Antwort zu posten. Ein paar Dinge: 1. Dürfen wir das <?Tag hier weglassen ? 2. Ich glaube, Ihre Klammern ->diffstimmen nicht. Im Moment rufen Sie das Echo und nicht das DateTime-Objekt auf. 3. echo funktioniert sowieso ohne runde klammern. 4. Auch nachdem ich das behoben habe, funktioniert das nicht für mich, aber ich bin neu im Golfspielen, so dass ich nur ein Idiot sein könnte.
Sworrub Wehttam
1
Führen Sie es einfach aus und sehen Sie, dass es gemäß den Anforderungen funktioniert. Beim Ausführen von PHP über die Befehlszeile muss kein Flush ausgeführt werden. Am Anfang der Zeichenfolge befindet sich ein \ r, mit dem der Cursor an den Zeilenanfang bewegt werden kann. Die zuvor ausgegebene Zeit wird weiterhin überschrieben. Es ist die gleiche Methode, die viele andere Antworten hier verwenden.
Chocochaos
1
Entschuldigung, ich habe deinen ersten Kommentar verpasst. Ja, wir dürfen die Eröffnungs-Tags weglassen, es sei denn, es ist erforderlich, ein vollständiges Programm bereitzustellen. Die Klammern sind gut so, wie sie sind. Ja, das Echo funktioniert ohne es, aber das Aufrufen von diff für das DateTime-Objekt funktioniert nicht ohne sie. Es läuft hier gut, welche PHP-Version verwenden Sie und wie führen Sie das Programm aus? :)
Chocochaos
1
Vielleicht möchten Sie einige Beiträge hier überprüfen: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos
1
Das deckt es fast ab, danke für den Einblick :)
Sworrub Wehttam
4

CJam, 69 62 59 57 Bytes

7 Bytes gespart durch Konvertierung in ein anderes Zeitformat

3 Bytes gespart dank Martin Enders Vorschlägen

2 Bytes mit einem Wagenrücklauf anstelle von Leerzeichen gespart

{15539904e5esm1e3/{60md\}2*24md\]W%{sYTe[}%':*CTe[oDco1}g

Kann aus offensichtlichen Gründen nicht auf TIO ausgeführt werden.

Die Anzeige wird ständig in einer Endlosschleife neu geschrieben, sodass der Text (zumindest in meiner Konsole) ein- und ausgeblendet wird, obwohl die Uhrzeit nur einmal pro Sekunde aktualisiert wird.

Diese 70-Byte-Version druckt nur einmal pro Sekunde:

{15539904e5es:Xm1e3/{60md\}2*24md\]W%{sYTe[}%':*CTe[oDco{esXm1e3<}g1}g

Erläuterung

{                           e# Begin a while loop
  15539904e5                e#  The timestamp on which Brexit will occur
  es                        e#  The current timestamp
  m                         e#  Subtract
  1e3/                      e#  Integer divide by 1000, converting to seconds from ms
  {                         e#  Run this block twice
   60md                     e#   Divmod by 60
   \                        e#   Swap top elements
  }2*                       e#  (end of block) 
                            e#    This block divmods the timestamp by 60, resulting in 
                            e#    the remaining minutes and seconds. Then the minutes get 
                            e#    divmod-ed by 60, to get hours and minutes remaining
  24md\                     e#  Divmod hours remaining by 24 and swap top elements, to get
                            e#    the hours left and days left.
  ]                         e#  Wrap the entire stack in an array
  W%                        e#  Reverse it since it's currently in the wrong order
  {                         e#  Apply this block to each element of the array
   s                        e#   Cast to string (array of digit characters)
   YTe[                     e#   Pad to length 2 by adding 0s to the left
  }%                        e#  (end of map block)
  ':*                       e#  Join with colons
  CTe[                      e#  Pad to length 12 by adding 0s to the left, dealing with the
                            e#    special case of the day being 3 digits. 
  o                         e#  Pop and print the resulting string, which is the time
  Dco                       e#  Print a carriage return, moving the cursor back to the start
  1                         e#  Push 1
}g                          e# Pop 1, if it's true, repeat (infinite loop)
Geschäfts-Katze
quelle
Kann jetzt nicht testen, aber man kann wohl ersetzen Abmit s, und ein Byte speichern , indem Sie 1e3/zuerst und dann in umgekehrter Reihenfolge teilen 60md\60md\24md\]W%.
Martin Ender
@MartinEnder Ja, beide arbeiten. Vielen Dank
Business Cat
Oh und {60md\}2*rettet einen anderen.
Martin Ender
3

Python 3.5 (118 Bytes)

import datetime as d,os
d=d.datetime
while 1:os.system("cls");e=str(d(2019,3,31)-d.today());print(e[:3]+':'+e[-15:-7])
officialaimm
quelle
3

C # 6, 149 Bytes

Vielen Dank an Bob für das Speichern von 57 Bytes!

using System;class P{static void Main(){DateTime a,x=new DateTime(2019,3,31);while((a=DateTime.Now)<x)Console.Write($"\r{x-a:ddd\\:hh\\:mm\\:ss}");}}

Ungolfed-Programm:

using System;

class P
{
    static void Main()
    {
        DateTime a,
                x = new DateTime(2019, 3, 31);
        while ( (a = DateTime.Now) < x)
            Console.Write($"\r{x-a:ddd\\:hh\\:mm\\:ss}");
    }
}

C #, 210 206 159 Bytes

Vielen Dank an Bob für das Speichern von weiteren 47 Bytes!

Vielen Dank an Martin Smith für das Speichern von 4 Bytes!

using System;class P{static void Main(){DateTime a,x=new DateTime(2019,3,31);while((a=DateTime.Now)<x)Console.Write("\r"+(x-a).ToString(@"ddd\:hh\:mm\:ss"));}}

Ungolfed-Programm:

using System;

class P
{
    static void Main()
    {
        DateTime a,
                x = new DateTime(2019, 3, 31);
        while ( (a = DateTime.Now) < x)
            Console.Write("\r" + (x - a).ToString(@"ddd\:hh\:mm\:ss"));
    }
}
adrianmp
quelle
1
new DateTime(2019,3,31)ist kürzer.
Martin Smith
1
Sie können auch die Zeichenfolge entfernen Console.Clearund stattdessen voranstellen "\r", z. B."\r"+(x-a)...
Bob
1
Weitere Verbesserungen: (x-a).ToString(@"d\:hh\:mm\:ss")Entspricht "String.Format" ("\ r {0: d \\: hh \\: mm \\: ss}", xa). Entspricht $@"{x-a:d\:hh\:mm\:ss}"(kürzerer, interpolierter String in C # 6.0). Wenn Sie das tun, können Sie dann weiter die volle verkürzen "\r"+$@"{x-a:d\:hh\:mm\:ss}"in $"\r{x-a:d\\:hh\\:mm\\:ss}".
Bob
1
@TheLethalCoder Ich habe das einfach so genommen, dass ein "gefälschter" Multi-Newline-Ansatz nicht erlaubt ist. Ein Wagenrücklauf überschreibt immer noch das Einzige auf dem Bildschirm. Mindestens eine andere Antwort verwendet ebenfalls diesen Ansatz. Kann auch den Ruhezustand aufheben, da es nur wichtig ist, dass sich die Anzeige einmal pro Sekunde ändert , wobei unveränderte Aktualisierungen zulässig sind (siehe Fragenkommentare). bearbeiten: eigentlich erlauben frage kommentare auch explizit die CR ...
bob
1
@Bob Sorry, ich habe deinen Vorschlag als neue Zeile gelesen, mein Fehler. Aber ja, der Schlaf kann entfernt werden
TheLethalCoder
3

C 104 Bytes

main(x){for(;x=1553990400-time(0);)printf("\n%03d:%02d:%02d:%02d\e[1A",x/86400,x/3600%24,x/60%60,x%60);}

Nervenzusammenbruch

main(x){
    for(;x=1553990400-time(0);)             // Seconds remaining
        printf("\n%03d:%02d:%02d:%02d\e[1A",// Move cursor and print:
            x/86400,                        // Days
            x/3600%24,                      // Hours
            x/60%60,                        // Minutes
            x%60);                          // Seconds
    puts("Now we can stop talking about it forever."); // Wishful thinking
}

Verlässt sich auf timedie Anzahl der zurückgegebenen Sekunden seit dem 01.01.1970, was für mich der Fall ist (mit Clang / GCC unter macOS) und für die meisten UNIX-Dinge der Fall sein sollte.

Bewegt den Cursor mithilfe von Bash- Terminal-Escape-Sequenzen um eine <esc>[1AZeile nach oben. Es wäre schöner, wenn man es einfach benutzen könnte \r, aber es printfwird erst dann geleert, wenn eine neue Zeile angezeigt wird, und das manuelle Leeren nimmt viel mehr Zeit in Anspruch.

Wahrscheinlich der CPU-intensivste Countdown, den ich je gesehen habe. Läuft in einer Hot-Loop, um sicherzustellen, dass sie immer so genau wie möglich ist. Wenn sie nach Ablauf der Frist ausgeführt werden, entstehen ziemlich seltsame Dinge (überall Negative!)

Dave
quelle
@TobySpeight sicher, korrigiert. Ich betrachte sie als Bash, weil ich immer diese Referenzseite benutze
Dave
Gibt es Regeln für die Hauptform in C? In C90: Auslassen der Rückgabe von Hauptursachen UB, falls der Aufrufer (OS) den Rückgabewert verwendet. In Standard C: main(x)ist keine gültige Form von main, implicit int wurde aus der Sprache entfernt. Ich glaube die minimale, sichere Version ist int main(){}.
Lundin
@Lundin In Code Golf werden Sprachen durch ihre Implementierung definiert. Wenn Sie also einen öffentlich verfügbaren Compiler finden, der den gewünschten Code kompiliert, können Sie dies tun. Wenn jedoch nicht standardmäßige Flags festgelegt werden müssen, zählen diese Flags zu Ihren bytecount). Sie haben Recht, dass dies nicht annähernd normkonform ist (wie Sie bereits bemerkt haben, gibt es implizit definierte Funktionen, da seit dem 01.01.1970 keine Importe mehr durchgeführt wurden und die Zeit nur noch wenige Sekunden zurückgibt). Werfen Sie einen Blick auf Meta, um herauszufinden, nach welchen (eher zerstreuten) Regeln die Leute hier vorgehen.
Dave
Ein Teil des Spaßes an Code-Golf-Herausforderungen besteht darin, bizarre Sprachhacks und veraltete Funktionen zu entdecken!
Dave
3

AHK , 145 Bytes

Dies ist nicht die kürzeste Antwort, aber das Ergebnis gibt ein sehr gutes Gefühl des Untergangs, denke ich. Ich habe ursprünglich versucht, die Tastenanschläge Ctrl+ Agefolgt von DELund dann zu jeder Zeit zu senden, aber die Aktualisierungsrate war zu langsam und würde die Umgebung zerstören, in der Sie sich befanden. Stattdessen habe ich mich für die grafische Benutzeroberfläche entschieden. Es stellte sich heraus, dass weniger Bytes erforderlich waren, um das Fenster vollständig zu zerstören und neu zu erstellen, als um die Steuerung immer wieder zu aktualisieren. Es ist ein schöner Effekt.

Loop{
s=20190331000000
s-=A_Now,S
d:=t:=20000101000000
t+=s,S
d-=t,D
d*=-1
FormatTime f,%t%,:HH:mm:ss
GUI,Destroy
GUI,Add,Text,,%d%%f%
GUI,Show
}

Ich werde das Doom-Lied singen!

Ingenieur Toast
quelle
3

C #, 128 127 Bytes

using System;class P{static void Main(){for(;;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");}}

Ungolfed-Code:

using System;
class P
{
    static void Main()
    {
        for(;;)
            Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}"); 
    }
}

Ich hätte den \ r Trick nicht ohne die Hilfe der anderen C # -Antworten hier herausgefunden.

Wenn Sie nach weiteren Verbesserungen suchen, können Sie auch den Write () - Ausdruck in die for-Schleife einfügen. Scheint, als könnte ich hier irgendwie ein Byte speichern, weil das mir das Semikolon für diese Anweisung erspart, aber die gleiche Zahl ergibt sich, weil Sie keinen vollständig leeren Körper haben können:

using System;class P{static void Main(){for(;;Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}"));}}
Joel Coehoorn
quelle
Willkommen bei PPCG!
Martin Ender
Sie können immer noch ein einzelnes Zeichen speichern, indem Sie eine interpolierte Zeichenfolge verwenden;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Bob
Gut gespielt habe ich versucht, einen Weg zu finden, eine Weile (true) Schleife in dem kürzestmöglichen Code zu haben! Ich werde mich an diesen Trick erinnern. Möglicherweise müssen Sie ein paar Leerzeichen hinzufügen, wie ich es getan habe. Andernfalls wird das letzte Zeichen Ihrer Zeitzeichenfolge nicht überschrieben, wenn der Tag von 3 auf 2 Stellen wechselt, und Sie erhalten eine seltsame Ausgabe
NibblyPig
Sie können ein Byte speichern, indem Sie eine interpolierte Zeichenfolge wie in meiner Antwort verwenden. Ihr Format dddfüllt die Nullen auf, sieht besser aus als die Zwei-Leerzeichen-Methode.
TheLethalCoder
Aktualisiert für die interpolierte Zeichenfolge.
Joel Coehoorn
3

Ruby (83 Bytes)

loop{h=431664-Time.now.to_r/3600;$><<['%02d']*4*?:%[h/24,h%24,h%1*60,h*3600%60]+?\r}

Ungolfed

loop do
  seconds = 1553990400 - Time.now.to_r

  print (["%02d"] * 4).join(':') % [
    seconds / 24 / 60 / 60     ,
    seconds      / 60 / 60 % 24,
    seconds           / 60 % 60,
    seconds                % 60,
  ] + "\r"
end

Grundsätzlich eine der Python-Einsendungen mit einigen Verbesserungen. Wir geben nur ein "\ r" aus, um vor dem erneuten Rendern an den Anfang der Zeichenfolge zu springen. Und für das String-Format von "%03d:%02d:%02d:%02d"ist uns die Breite des ersten Spezifizierers wirklich egal ... also können wir einfach "%02d"*4ein Backspace und ein Leerzeichen ausgeben, um den zusätzlichen unnötigen Doppelpunkt zu löschen.

Auch ich fand einen zweistelligen kürzer print: $><<. $>ist eine Abkürzung für global $defout, die der Ausgangsstrom für ist printund printfauf und Standardwerte STDOUT. IO#<<Schreibt die rechte Seite in den Stream. Wie ist das zwei Zeichen kürzer? Nun, ich kann jetzt den Raum weglassen, der vor der Klammer geführt hat, die die Formatzeichenfolge umschließt.

Zu diesem Zeitpunkt denke ich wirklich, dass es keine Möglichkeit gibt, dieses Programm in Ruby weiter zu verkürzen.

Edit: Ich habe mich geirrt. Anstelle der ersten Time.new(2019,3,31), können wir verwenden nur die rohe UNIX Zeit: 1553990400.

Bearbeiten 2: Ich habe versucht, mit dem Ausklammern von Minuten und dem Teilen des UNIX-Zeitstempels durch diese Konstante herumzuspielen, aber es spart tatsächlich keine Bytes. :(

Edit 3: Stellt sich heraus, dass Caching h=3600mich tatsächlich um zwei Bytes verletzt. Hoppla.

Edit 4: 3 Bytes dank @EricDuminill gespeichert. Er benutzte Posen, aber die Rationals funktionieren ohne Präzisionsverlust!

Edit 5: Array#*als Alias ​​für Array#join, mit der Ruby- ?Syntax für einzelne Charaktere!

Stephen Touset
quelle
Das Arbeiten mit Stunden anstelle von Sekunden scheint 3 Bytes zu sparen: Die loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}Sekunden können jedoch aufgrund von Rundungen um 1 verschoben sein.
Eric Duminil
Vielen Dank! Jetzt mit PHP verbunden. :) Ich benutzen to_rstatt to_fPräzision zu erhalten.
Stephen Touset
Bitte. Diese Uhr kann noch 1s sein früh aber, auch mit .to_rstatt.to_f
Eric Duminil
@StephenTouset Sie können sich +"\r"rechts vom Array bewegen . Auf diese Weise können Sie ['%02d']*4*?:anstelle von '%02d:'*4+"\b "die Klammern verlieren, wodurch Sie ein Byte erhalten. Speicher noch ein weiteres Byte durch das Schreiben +?\rstatt +"\r".
Synoli
Hervorragende Entdeckung!
Stephen Touset
2

JavaScript + HTML, 136 + 7 = 143 Bytes

setInterval("d=1553990400-new Date/1e3|0;w.innerText=[60,60,24,999].map(z=>(q='00'+d%z,d=d/z|0,q.slice(z<61?-2:-3))).reverse().join`:`")
<a id=w
user12864
quelle
Macht das Ergebnis es zu einem ... Liebesbyte ?
Ingenieur Toast
2

142 Bytes

using System;class P{static void Main(){a:Console.Write($"\r{(new DateTime(2019,3,31)-DateTime.Now).ToString("d\\:h\\:mm\\:ss  ")}");goto a;}}

Ungolfed-Programm:

using System;
class P
{
    static void Main()
    {
        a: Console.Write($"\r{(new DateTime(2019, 3, 31) - DateTime.Now).ToString(@"d\:h\:mm\:ss  ")}"); goto a;
    }
}
NibblyPig
quelle
Dies wird nicht aufhören zu drucken, wenn es Brexit trifft, nicht sicher, ob das ein Problem ist
TheLethalCoder
@TheLethalCoder Das ist legal. In den Anweisungen heißt es ausdrücklich, dass der Code nur bis zum 31.3.19 funktionieren muss, und was danach passiert, spielt keine Rolle. Wenn Sie durch seltsame Ausgaben oder sogar Ausnahmen nach diesem Datum Bytes sparen können, haben Sie mehr Energie.
Joel Coehoorn
Außerdem: Ich vermute, dass es möglich sein wird, dieses Problem zu beheben, indem die ToString()Bytes übersprungen werden und stattdessen die Formatierung in die Write () -Methode oder eine interpolierte Zeichenfolge
eingebaut wird
Okay ... es ist definitiv möglich. Ich habe es bis zu 127 Bytes. Ich hänge es unter Ihrem Original an, damit Sie die Grundidee trotzdem würdigen können goto.
Joel Coehoorn
Meine Bearbeitung wurde gelöscht :( Vermutlich muss ich meine eigene Antwort veröffentlichen.
Joel Coehoorn
2

Bash + GNU Datum, 128 Bytes

Dank @muru 2 Bytes und dank @This Guy 2 Bytes früher.

C=:%02d;while sleep 1;do D=$[B=3600,A=24*B,1553990400-`date +%s`];printf "%03d$C$C$C\r" $[D/A] $[D%A/B] $[D%A%B/60] $[D%60];done

Ungolfed

DAY=86400
HOUR=3600
while sleep 1 ; do
 DIFF=$[1553990400-`date +%s`]
 printf "%03d:%02d:%02d:%02d\r" \
         $[DIFF/DAY] \
         $[DIFF%DAY/HOUR] \
         $[DIFF%DAY%HOUR/60] \
         $[DIFF%60]
done
Steve
quelle
1
Noch nie in Bash golfed vor , aber können Sie die Räume an der während entfernen: while[1]?
Caird Coinheringaahing
Fairer Punkt, habe jetzt gegeben, dass ein Versuch, aber es gibt line 1: [1]: command not foundFehler. Die Räume sind obligatorisch es scheint :-(
steve
2
Einer 3600Variablen zuweisen , um 2 Bytes zu sparen? Vielleicht haben Sie auch in der Lage zu ändern , B=3600;A=86400um B=3600;A=24*Bfür ein anderes Byte?
Caird Coinheringaahing
3600 variable jetzt erledigt, danke 24 * B müsste da aber A=$[24*B]so nicht möglich sein
Steve
1
C=:%02d;printf "%03d$C$C$C\r"ein Byte speichern? Und verschieben Sie die Zuweisungen im arithmetischen Kontext nach A und B: D=$[B=3600,A=24*B,1553990400-`date +%s`]um eine andere zu speichern?
muru
2

MATL, 45 Bytes

737515`tZ'-tkwy-':HH:MM:SS'XOw'%03d'YDwYcDXxT

TIO unterstützt das Löschen der Ausgabe anscheinend nicht, aber zum Glück tut es MATL Online !

Mit 2 Bytes mehr, eine etwas CPU-freundlichere Version, die pausejede Sekunde einen (Ruhezustand) ausführt:

737515`tZ'-tkwy-':HH:MM:SS'XOw'%03d'YDwYcDT&XxT

Versuchen Sie dies auf MATL Online

737515"31. März 2019" steht für MATLABs Standard-Epochenformat - Anzahl der Tage ab dem 0. Januar 0000, optional einschließlich eines Bruchteils zur Darstellung der Tageszeit. (Ich habe versucht, dies zu verkürzen, indem ich es irgendwie berechnet habe, aber seine einzigen Faktoren sind 5 und eine weitere sechsstellige Zahl (147503), und ich konnte keinen Weg finden, dies in weniger als 6 Bytes zu tun.)

`    % start do-while loop
tZ`- % duplicate Brexit date, get current date (& time), subtract
tk   % duplicate the difference, get the floor of it (this gives number of days left)
w    % switch stack to bring unfloored difference to top
y    % duplicate the floored value on top of that
-    % subtract to get fractional part representing time
':HH:MM:SS'XO % get a datestr (date string) formatted this way
w    % switch to bring number of days back on top
'%03d'YD      % format that to take 3 places, with 0 padding if needed
wYc  % switch to bring time string back on top, concatenate date and time
D    % display the concatenated result!
T&Xx % clear screen after a 1 second pause (the pause is optional, without it the call is `Xx`)
T    % push True on stack to continue loop
Sundar - Setzen Sie Monica wieder ein
quelle
1

PHP, 64 Bytes

while($d=1553990401-time())echo--$d/86400|0,date(":H:i:s\r",$d);

Dies zählt genau bis 0:00:00:00und dann Pause / Exit. Laufen Sie mit -r.

-2 Bytes, wenn ich die 0 nicht drucken müsste.

Titus
quelle
1

RPL, 83-78 Bytes

Angenommen, Ihr HP48 oder ein ähnliches Gerät ist mit der korrekten Uhrzeit und dem korrekten Datum (UK), dem mm / tt-Datumsformat und dem 24-Stunden-Zeitformat eingerichtet:

WHILE 1REPEAT DATE 3.302019DDAYS":"1.1 24TIME HMS- TSTR 15 23SUB + + 1DISP END

Ich war überrascht, dass ich durch Entfernen von Leerzeichen 2 Byte einsparen konnte ":". 1.1 ist das kürzeste gültige Datum, das später von abgeladen wird SUB. Seien Sie vorsichtig mit Emulatoren, die Zeit läuft möglicherweise schneller oder langsamer (oder gar nicht) als Ihre Wanduhr. Bei einem echten HP können Sie dieses Programm beenden, indem Sie die Taste ON drücken ... oder auf leere Batterien warten.

Perlmutt
quelle
0

PHP, 102 95 90 Bytes

7 Bytes gespart dank @TheLethalCoder & ohne Faktorisierung

Durch Verketten weitere 5 Byte gespeichert

<? $b=1553990400-time();echo floor($b/$d=86400).date(':H:i:s', $b%$d);header('Refresh:1');

Dies ist mein erstes Golfspiel, daher fehlen mir wahrscheinlich einige Tricks, aber hier bist du trotzdem.

Was die PHP-Antwort von @chocochaos betrifft, die dies sonst übertrumpfen würde, glaube ich, dass sie aus Gründen fehlerhaft ist, die ich in meinen Kommentaren erläutert habe, aber da ich neu hier bin, könnte ich mich irren. Oder ich bin nur ein Neuling :)

Sworrub Wehttam
quelle
Möglicherweise benötigen Sie einen Abschluss-Tag? (Da bin ich mir nicht sicher). Sie können $adie Nummer auch nur einmal verwenden. Ich bin nicht so vertraut mit PHP, aber es sieht so aus, als ob es weitere Verbesserungen geben könnte
TheLethalCoder
Was meinst du damit flawed because of reasons stated in the comments? Wenn Sie die Kommentare zu ihrer Antwort meinen, sind Sie der einzige, der kommentiert hat.
Caird Coinheringaahing
@TheLethalCoder Kein schließendes Tag erforderlich. Und schön!
Sworrub Wehttam
1
Sie können ~ 7 Bytes sparen, indem Sie ein <?=Eröffnungs-Tag verwenden und das Echo $ban der Stelle ablegen, an der Sie es zum ersten Mal verwenden. Zusätzlich können Sie 3 Bytes mit ^0anstelle von speichern floor. Es ist bitweise oder und beinhaltet eine Besetzung auf int, es ist der kürzeste Weg, um auf int zu wirken, den ich gesehen habe.
user59178
1
Meine Antwort ist in Ordnung :) Vielleicht möchten Sie auch einige Beiträge hier nachlesen : codegolf.meta.stackexchange.com/questions/tagged/php Auch das Öffnen von Tags ist nicht erforderlich. Ich würde wirklich empfehlen, Ihre Lösung so zu schreiben, dass sie von der Befehlszeile aus ausgeführt wird. Dann müssten Sie nicht mit den Kopfzeilen herumspielen, um sie zu aktualisieren. Diese Aktualisierung führt auch dazu, dass Ihre Lösung von Zeit zu Zeit eine Sekunde "verpasst", da die durch die Anforderung selbst verlorene Zeit nicht berücksichtigt wird.
Chocochaos
0

AWK , 78 Bytes

BEGIN{for(;v=1552953600-systime();printf"\r%d:%s",v/86400,strftime("%T",v)){}}

Probieren Sie es online!

Es dauerte länger, bis mir klar wurde, dass ich die Endzeit vorberechnen konnte. Manchmal lohnt es sich, etwas zu spät zum Spiel zu kommen und Ideen von anderen zu bekommen.

Zu Ihrer Information, die TIO-Verbindung funktioniert nicht sehr gut, da sie nicht \rrichtig implementiert wird.

Robert Benson
quelle
0

F #, 142 Bytes

open System
let f=
 let t=DateTime(2019,3,31)
 while DateTime.Now<=t do Console.Clear();t-DateTime.Now|>printf"%O";Threading.Thread.Sleep 1000

Ich bin in Irland ungefähr einen halben Kilometer von der Grenze entfernt aufgewachsen. Abgesehen von einem "Welcome to Fermanagh" -Schild und den sich ändernden Straßenmarkierungen wüssten Sie nicht, dass Sie in ein anderes Land eingereist sind. Auf dem Schulweg zweimal überquert.

Ciaran_McCarthy
quelle
0

c, gcc 114 Bytes

main(s){system("clear");if(s=1553900399-time(0)){printf("%d:%d:%d:%d\n",s/86400,s/3600%24,s/60%60,s%60);main(s);}}

Nichts ausgelassen, volles Programm. Das Programm wird unter Ubuntu in gcc kompiliert. Der Countdown zeigt aufgrund des Systemaufrufs zum Löschen keine langen Spuren von Druckanweisungen an und wird angehalten, wenn der Countdown 0 Sekunden erreicht.

Ungolfed

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>


//Brexit countdown timer
int main(){
  int sec = 1553900400 - time(0);//seconds remaining until Brexit
  if(sec){
    sleep(1);
    system("clear");
    printf("Brexit Countdown\n");
    printf("days Hours Mins Secs\n");
    printf("%d:  %d:    %d:  %d\n",
            sec/86400, sec/3600%24,
            sec/60%60, sec%60);
    main();
  }
}
Geo
quelle