Zeigen Sie eine Digitaluhr an

20

Zeigen Sie eine Digitaluhr an

(Ich sehe, dass es viele Herausforderungen mit der Uhr gibt. Ich habe versucht, alle zu lesen. Ich bin mir ziemlich sicher, dass dies einzigartig ist.)

Schreiben Sie einen Code, der kontinuierlich eine Digitaluhr im Format angezeigt aktualisiert , h:m:swo h, mund sbesetzen können 1 oder 2 Zeichen. Die Einschränkungen in einfachen Worten wie @BlueEyedBeast ausgedrückt, ich möchte im Grunde, dass es die angezeigte Zeit ersetzt.

  • Zeilenumbrüche sind nicht erlaubt
  • Nachgestellte Leerzeichen sind erlaubt
  • Andere abschließende Zeichen sind nicht zulässig
  • Es dürfen keine Sekunden verpasst werden (57 -> 59 sind nicht erlaubt)
  • Zahlen, die mit "0" beginnen, sind zulässig, solange sie nicht mehr als 2 Zeichen belegen
  • Der Code darf keine Eingaben annehmen
  • Wenn Ihre Sprache die aktuelle Zeit ohne Eingabe nicht abrufen kann, können Sie bis zu 8 Byte auf eine standardmäßig zulässige Weise eingeben
  • Die Ausgabe muss auf Standard sein
  • Das ist Codegolf, also gewinnt die kürzeste Antwort!

Beispiel

Ich arbeite an einer Sprache mit dem Namen *> <> (Seestern), da solche Programme in> <> nicht möglich sind (warten Sie nur auf die Datei-Ein- / Ausgabe). Hier ist ein funktionierendes Digitaluhrprogramm (ungolfed). Dieses Programm ist geschrieben in *> <> :

s":"m":"hnonon"   "ooo88888888888ooooooooooo1S

Hinweis: Alles ist identisch mit> <>, außer, s = Sekunde, m = Minute, h = Stunde, S = Schlaf (100 ms * x)

Dies gibt aus:

14:44:31

Aktualisierung alle 100ms bis zum Abschluss.

Nicht zugelassene Beispiele

Folgendes ist nicht erlaubt:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

Die Uhrzeit muss in der ersten Zeile stehen, in der sie ohne sichtbare nachgestellte Zeichen ausgegeben wurde. Das Löschen des Terminals ist jedoch zulässig, da es immer noch keine nachgestellten Zeichen gibt.

redstarcoder
quelle
1
Müssen wir 100ms warten oder können wir einfach ständig für immer updaten?
Blue
1
Sie müssen nicht warten, das Warten ist genau das, was das Beispiel tut.
Redstarcoder
2
Die Herausforderungsanforderungen scheinen mir zu streng.
mbomb007
1
@ mbomb007 Ich habe entfernt "Das Programm muss in der Lage sein, bei Benutzereingaben zu beenden, die kein Signal / Interrupt sind", da die aktuellen Antworten sowieso nicht darauf zu folgen schienen.
Redstarcoder
1
Kann sich das Programm auf eine bestimmte lokale Einstellung des Betriebssystems verlassen?
Raznagul

Antworten:

5

Pyke, 6 Bytes

Ctr\ J

Probieren Sie es hier aus!

Ich denke das ist gültig. Ersetzen Sie das Leerzeichen durch Wagenrücklauf für eine gültige Ausgabe (funktioniert nicht online)

Blau
quelle
Tut mir leid, das ist es nicht. Nach der Zeit sind keine Zeilenumbrüche oder nachgestellten Zeichen zulässig. Ich werde 2 Beispiele genauer beschreiben.
Redstarcoder
Ich sehe das nicht in der Spezifikation?
Blue
1
In der ersten Zeile wird angegeben, dass Zeilenumbrüche nicht zulässig sind, in der dritten Zeile werden keine nachgestellten Zeichen angegeben. Es tut mir leid, wenn das unklar ist, ich würde mich über Ratschläge zur Behebung freuen.
Redstarcoder
Sie möchten also, dass es die alte angezeigte Zeit ersetzt?
Blue
Ja genau! Ihr aktueller Code scheint perfekt zu sein.
Redstarcoder
10

HTML + JS (ES6), 8 + 60 = 68 Byte

In Chrome getestet.

setInterval`a.innerHTML=new Date().toLocaleTimeString('fr')`
<a id=a>

-1 Byte (@ETHProductions): Verwenden Sie das französische Zeitformat anstelle von .toTimeString().slice(0,8)


HTML + JS (ES6), 8 + 62 = 70 Byte

Dies funktioniert in FireFox.

setInterval('a.innerHTML=new Date().toLocaleTimeString`fr`',0)
<a id=a>

-3 Bytes (@ETHProductions): Verwenden Sie das französische Zeitformat anstelle von .toTimeString().slice(0,8)

darrylyeo
quelle
2
Wie funktioniert das? Ich habe die Backtick-Syntax noch nie gesehen. Ich kann nach einigem Suchen auch nichts darauf finden.
Carcigenicate
1
Arbeiten für mich in Inox (Chrom)
Redstarcoder
1
@Carcigenicate Es ist Teil der neuesten JavaScript-Spezifikation ECMAScript6. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
darrylyeo
@darrylyeo Danke. Ich konnte Dinge in der wörtlichen Syntax finden, aber ich konnte nicht sehen, wie es hier angewendet wurde. Ich muss die Spezifikation noch einmal lesen. Ich verstehe immer noch nicht, wie die Funktion vor dem Backtick verwendet wird.
Carcigenicate
2
Sie können 3 Byte im Firefox mit new Date().toLocaleTimeString`fr` (1 Byte im Chrome mit ...TimeString('fr'))
ETHproductions speichern
6

Python 2, 50 Bytes

(Python 2.1+ ctimeohne Argument)

import time
while 1:print'\r'+time.ctime()[11:19],

time.ctime()ergibt eine formatierte Zeichenkette, aus der mit hh: mm: ss geschnitten werden kann [11:19](sie bleibt unabhängig von Datum und Uhrzeit an derselben Stelle).

printWenn Sie den Wagenrücklauf '\r'vor dem Text aktivieren und den Text zum ersten Element eines Tupels mit machen ,, wird das implizite Nachlaufen effektiv unterdrückt '\n'und die zuvor geschriebene Ausgabe überschrieben.

while 1 Schleifen für immer.

Jonathan Allan
quelle
3
Ich denke, dies braucht eine ,am Ende, um die Zeilenumbrüche zu unterdrücken, sonst in Python 2.7.12 bekomme ich Zeilenumbrüche.
Redstarcoder
Ups, ja, Sie sind richtig ... aktualisiert
Jonathan Allan
5

Mathematica, 48 41 37 28 Bytes

Do[s=Now[[2]],∞]~Monitor~s

Die Ausgabe wird TimeObjectkontinuierlich aktualisiert.

Sieht aus wie das: Bildbeschreibung hier eingeben

Alternative Versionen

48 Bytes:

Dynamic@Refresh[TimeObject[],UpdateInterval->.1]

53 Bytes:

Dynamic@Refresh[DateString@"Time",UpdateInterval->.1]
JungHwan min
quelle
1
Haben Sie bei der sekündlichen Aktualisierung sichergestellt, dass keine Sekunden übersprungen werden? (Bsp .: 11:11:11 -> 11:11:13)
redstarcoder
Dynamic@{DateString@TimeObject[], Clock[]}[[1]]
DavidC
1
@redstarcoder es aktualisiert alle ~ 1.002s, so dass ich alle 100ms aktualisiert
JungHwan Min
Welp, mir ist nur klar geworden, dass ich das eigentlich nicht brauche Pause.
JungHwan Min
Dynamic@{Now,Clock[]}[[1]]ist 26 Bytes und zeigt ein Datum / Uhrzeit-Objekt. Dynamic@{DateString@"Time",Clock[]}[[1]]ist 40 Bytes und gibt nur hh: mm: ss
Kelly Lowder
5

Ich sehe, dass die Anforderung für einen Nicht-Signal-UI-Eingang zum Stoppen des Programms entfernt wurde. Jetzt können wir also Folgendes tun:

Bash + Coreutils, 28

yes now|date -f- +$'\e[2J'%T

yes Gibt den String "now" fortlaufend einmal pro Zeile in eine Pipe aus.

date -f-reads interpretiert jedes "now" als die aktuelle Uhrzeit und gibt es dann im gewünschten Format aus. Die Formatzeichenfolge enthält die ANSI-Escape-Sequenz zum Löschen des Bildschirms. date tut nach dem Datum eine neue Zeile aus - ich bin mir nicht sicher, ob dies disqualifiziert, da der Bildschirm ohnehin jedes Mal gelöscht wird.

Wenn es disqualifiziert, können wir verwenden tr stattdessen verwenden:

Bash + Coreutils, 31

yes now|date -f- +%T|tr \\n \\r

Bisherige Antworten:

Bash + X, 32

xclock -d -update 1 -strftime %T

Leider kann dies nur jede Sekunde aktualisiert werden. Wenn dies disqualifiziert, können wir dies stattdessen tun:

Bash + Coreutils, 43

until read -t0
do printf `date +%T`\\r
done
Digitales Trauma
quelle
Das Aktualisieren jeder Sekunde ist in Ordnung, solange keine Sekunden übersprungen werden (IE: 12-> 14).
Redstarcoder
Ich werde deine Newline zulassen! Ich hätte nie gedacht, dass dieser Fall heh passieren würde.
Redstarcoder
Ist das erlaubt? date +$'\e[2J'%T;$0
Evan Chen
@EvanChen Nein, da jede Iteration rekursiv einen neuen Prozess erzeugt und schließlich den verfügbaren Speicher oder PID-Speicher belegt, analog zu einem Stapelüberlauf. Sie könnten jedoch date +$'\e[2J'%T;exec $0für 24 Bytes tun ...
Digitales Trauma
4

QBIC , 6 Bytes

{_C?_d

{      Starts a DO-loop
 _C    CLS
   ?   PRINT
    _d TIME$

Löscht ständig den Bildschirm und druckt die Systemzeit im Format 22:03:41.

steenbergh
quelle
3

Clojure, 150 136 141 Bytes

V3: 141 Bytes :(

+5 Bytes, um einen Fehler zu beheben. Da die Zeiten nicht mit Nullen aufgefüllt sind, kann die Uhr "schrumpfen" und expandieren, wenn sich die Zeit ändert. Es "schmierte", als es schrumpfte, weil die letzte Ziffer nicht mehr gelöscht wurde. Es wurde behoben, indem am Ende einige Leerzeichen hinzugefügt wurden, um sicherzustellen, dass alles überschrieben wird.

#(while true(flush)(print(str(apply str(repeat 9"\b"))(.format(java.text.SimpleDateFormat."H:m:s")(java.util.Date.))"   "))(Thread/sleep 99))

V2: 136 Bytes

#(while true(flush)(print(str(apply str(repeat 9"\b"))(.format(java.text.SimpleDateFormat."H:m:s")(java.util.Date.))))(Thread/sleep 99))

-14 Bytes durch Umschalten auf SimpleDateFormatdas Formatieren des Datums. Immer noch riesig.

V1: 150 Bytes

#(while true(let[d(java.util.Date.)](flush)(print(str(apply str(repeat 9 "\b"))(.getHours d)":"(.getMinutes d)":"(.getSeconds d)))(Thread/sleep 100)))

Mir wurde klar, dass ich wahrscheinlich den schlechtesten Weg nutze, um das Datum herauszufinden. Hier besteht definitiv Verbesserungsbedarf.

Ungolfed:

(defn -main []
  (while true
    (let [d (java.util.Date.)]
      (flush)
      (print
        (str
          (apply str (repeat 9 "\b"))
          (.getHours d)":"(.getMinutes d)":"(.getSeconds d)))
      (Thread/sleep 100))))
Karzigenat
quelle
3

Bash + Watch, 19 Bytes

watch gehört nicht zu coreutils , ist aber in praktisch jeder Linux-Distribution sofort verfügbar.

Golf gespielt

watch -tn1 date +%T

Probieren Sie es online!

Zeppelin
quelle
2

WinDbg, 73 Bytes

.do{r$t0=0;.foreach(p {.echotime}){r$t0=@$t0+1;j8==@$t0'.printf"p \r"'}}1

Es wird kontinuierlich eine Zeile mit der aktuellen Zeit aktualisiert, bis der Benutzer Strg + Umbruch drückt.

Wie es funktioniert:

.do                          * Start do-while loop
{
    r$t0 = 0;                * Set $t0 = 0
    .foreach(p {.echotime})  * Foreach space-delimited word in a sentence like "Debugger (not 
    {                        * debuggee) time: Mon Dec  5 14:08:10.138 2016 (UTC - 8:00)"
        r$t0 = @$t0+1;       * Increment $t0
        j 8==@$t0            * If $t0 is 8 (ie- p is the current time)
        '
            .printf"p \r"    * Print p (current time) and \r so the next print overwrites
        '
    }
} 1                          * Do-while condition: 1, loop forever

Beispielausgabe (na ja, Sie haben die Idee):

0:000> .do{r$t0=0;.foreach(p {.echotime}){r$t0=@$t0+1;j8==@$t0'.printf"p \r"'}}1
14:10:12.329
Milch
quelle
2

PHP, 28 Bytes

for(;;)echo date("\rH:i:s");

Das date Funktion druckt buchstäblich alles aus, was sie nicht erkennt.

\r ist der Wagenrücklauf, setzt den Cursor auf die erste Spalte.

Laufen Sie mit -r.

Titus
quelle
2

MATL , 11 Bytes

`XxZ'13XODT

Endlosschleife, die den Bildschirm löscht und die Uhrzeit im angegebenen Format druckt.

Sie können es bei MATL Online ausprobieren! . Dieser Compiler ist experimentell. Wenn es nicht funktioniert, aktualisieren Sie die Seite und klicken Sie erneut auf "Ausführen".

Luis Mendo
quelle
2

82 Bytes

()=>{for(;;)Console.Write(new string('\b',8)+DateTime.Now.ToString("HH:mm:ss"));};

Anonyme Methode, die ständig 8 Zeichen mit neuer Ausgabe überschreibt. Kann 1 Byte kürzer gemacht werden, wenn geändert wird, um einen Dummy-Parameter zu akzeptieren ( z=>...).

Volles Programm:

using System;

public class Program
{
    public static void Main()
    {
        Action a =
        () =>
        {
            for (;;)
                Console.Write(new string('\b', 8) + DateTime.Now.ToString("HH:mm:ss"));
        };

        a();
    }
}
adrianmp
quelle
1
Darf man nicht importieren System? Einige Leute tun es, und einige Leute nicht: /
Yytsi
Er hat nicht in seiner eigentlichen Lösung, nur im Demo-Programm, also ja, es ist in Ordnung
Stefan
2

C #, 65 Bytes

()=>{for(;;)Console.Write("\r"+DateTime.Now.ToLongTimeString());};

Überschreibt dieselbe Zeile in einer Endlosschleife

Stefan
quelle
2

SmileBASIC 3.3.2, 38 Bytes

@L?TIME$;" ";
GOTO@L

UTF-16 saugt :(

Auf jeden Fall wird die Ortszeit wiederholt in HH: MM: SS mit einem Leerzeichen danach und ohne Zeilenumbruch ausgegeben. Es wird jedoch nicht jede Sekunde aktualisiert, sondern immer wieder gedruckt.

Schnecke_
quelle
Tut mir leid, das ist nicht gültig, es muss die Ausgabe ersetzen, das ist nicht der Fall. Setzen Sie die erste Zeile auf @L?TIME$und fügen Sie eine Zeile nach (für insgesamt 3 Zeilen) ein, LOCATE 0, 0die den Trick enthält (unterstützt SmileBASIC die Wagenrückführung?).
Redstarcoder
Außerdem hast du vergessen, die Newline zu punkten, was 40 Bytes ergibt (UTF-16 ist brutal für Code-Golf). Sie können die Zeichenlänge sehr einfach über Python REPL ermitteln len(""" YOUR CODE HERE """)und dann einfach * 2 für UTF-16 ausführen .
Redstarcoder
Kein SB macht CR tatsächlich nicht, ich müsste eine LOCATE-Anweisung dort reinschieben, die meine Punktzahl absolut zerstören würde: P Oder ein CLS: VSYNC, das genauso schlecht ist.
snail_
Ja, leider ist diese Lösung ohne sie ungültig. Gute Nachrichten! SmileBASIC wird als UTF-8 gewertet .
Redstarcoder
2

C 134 116 89 80 76 75 73 Bytes

main(n){for(;time(&n);)printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

---- Old versions:
main(n){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

---- 

n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

----

Saved 9 more bytes thanks to @nmjcman101 again:
n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",(n/3600)%24,(n/60)%60,n%60);}

----

Saved 27 bytes thanks to @nmjcman101
n,b[9];main(){for(;;){n=time(0);strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}

----

I figured out I don't need to put `#include<stdio.h>` into the file :)
#include<time.h>
main(){for(;;){time_t n=time(0);char b[9];strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}

----

#include<time.h>
#include<stdio.h>
main(){for(;;){time_t n=time(0);char b[9];strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}
Stefan
quelle
Es sieht aus wie (für mich) Sie können auch entfernen time.h. Dadurch wird der Typ time_t entfernt, daher müssen Sie stattdessen n als int definieren. Dies kann erreicht werden, indem es außerhalb von main (like n;main...) deklariert wird , wodurch die Notwendigkeit von int. Sie können auch von der loszuwerden charmit dem gleichen Trick: b[9];main.... Sie sind beide int-Typ, aber es ist flexibel genug.
nmjcman101
Wow, vielen Dank, ich wusste nicht, dass das funktionieren würde. Vielen Dank
Stefan
Bitte hören Sie auf, wenn Sie selbst Golf spielen möchten, aber ich habe auch das strftime...und das herausgenommen b[9]und nur einen Druck darauf gemacht: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); Ich bin mir nicht sicher, ob die Eltern gebraucht werden oder nicht. Sie können auch eine Reihe von {}for(;;)a,b,c;
entfernen,
1
Diese Klammern nerven. (n/60)%60im Ernst?
Anatolyg
1
Sie können , indem er erklärt 1 Byte speichern nals Parameter main, sagen main(n)stattn;main()
Karl Napf
2

Powershell, 39 Bytes

for(){write-host -n(date -F h:m:s`0`r)}

Weil ich cls in Powershell nicht mag. Aus dem Beitrag von briantist unter /codegolf//a/102450/63383

Daniel Cheng
quelle
2

Pascal, 61 Bytes

uses sysutils;begin while 1=1do write(#13,timetostr(now))end.

Free Pascal hat schöne Zeitroutinen in SysUtils Einheit. Ungolfed:

uses
  sysutils;
begin
  while 1=1 do
    write(#13, timetostr(now));
end.
hdrz
quelle
2

C 65 (vorige 64) Bytes

Funktioniert garantiert auf Linux-Rechnern. :)

@ Marco Danke!

f(){while(1){system("date +%T");usleep(100000);system("clear");}}
Abel Tom
quelle
1

Vim, 26 Bytes

qqS<C-r>=strftime("%T")<CR><esc>@qq@q

Dadurch wird ein rekursives Makro (z. B. eine Ewige Schleife) erstellt, das den gesamten Text in der aktuellen Zeile löscht und durch die aktuelle Uhrzeit ersetzt.

DJMcMayhem
quelle
1

Pyth - 28 Bytes

Ein bisschen länglich, weil Pyth keine Freizeit hat.

#p+"\r"j\:m.[`02`dP>4.d2.d.1
Maltysen
quelle
1

Groovy, 45 Zeichen

for(;;)print(new Date().format("\rHH:mm:ss"))
Mann bei der Arbeit
quelle
1

Gelee , 8 Bytes

13Ọ7ŒTȮß

13Ọ        chr(13), carriage return
   7ŒT     time string, which extends the previous character
      Ȯ    print
       ß   call the whole link again

Probieren Sie es online!

Der Wagenrücklauf funktioniert nicht online und ich kann den Interpreter nicht zum Laufen bringen, daher ist er ein bisschen ungetestet, aber er funktioniert wie erwartet, wenn ich druckbare Zeichen anstelle des CR verwende.

JayDepp
quelle
1

ForceLang, 123 Byte

def s set
s d datetime
s z string.char 8
s z z.repeat 16
label 1
io.write z
io.write d.toTimeString d.now()
d.wait 9
goto 1

datetime.toTimeStringwird in der Referenzimplementierung von Java unterstützt DateFormat.getTimeInstance(), das vom Gebietsschema abhängt, sodass Sie das Standardgebietsschema des Systems auf ein Gebietsschema festlegen können, das die 24-Stunden-Zeit verwendet.

SuperJedi224
quelle
1

PowerShell, 30 28 24 20 Byte

Die Region meines Computers wurde basierend auf in Deutschland geändert dem Kommentar raznagul geändert , um 4 Bytes zu sparen. :)

for(){date -F T;cls}

Vorherige Version, die in allen Ländereinstellungen funktioniert.

for(){date -F h:m:s;cls}
Briantist
quelle
0

Batch, 36 Bytes

@set/p.=␈␈␈␈␈␈␈␈%time:~0,8%<nul
@%0

Wobei das ASCII-BS-Zeichen (Code 8) darstellt.

Neil
quelle
0

Schläger, 71 Bytes

(require srfi/19)(let l()(display(date->string(current-date)"↵~3"))(l))

Wo ist eigentlich ein CR (hex 0d). Hex-Dump des Programms zur weiteren Verdeutlichung (Hinweisbyte an Position hex 4d):

00000000  28 72 65 71 75 69 72 65  20 73 72 66 69 2f 31 39  |(require srfi/19|
00000010  29 28 6c 65 74 20 6c 28  29 28 64 69 73 70 6c 61  |)(let l()(displa|
00000020  79 28 64 61 74 65 2d 3e  73 74 72 69 6e 67 28 63  |y(date->string(c|
00000030  75 72 72 65 6e 74 2d 64  61 74 65 29 22 0d 7e 33  |urrent-date)".~3|
00000040  22 29 29 28 6c 29 29                              |"))(l))|
00000047

Verwendet SRFI / 19, das in der Racket-Distribution enthalten ist. (current-date)Ruft das aktuelle lokale Datum und die Uhrzeit ab. Das date->stringFormat ~3ist ISO-8601 Stunden-Minuten-Sekunden-Format. (let l () ... (l))in einer idiomatischen Endlosschleife. (require srfi/19)lädt das srfi/19Modul.

Winny
quelle
0

C 156 Bytes

#include<stdio.h>
#include<time.h>
int main(){time_t a;struct tm *b;char c[9];for(;;){time(&a);b=localtime(&a);strftime(c,9,"%H:%M:%S",b);printf("%s\r",c);}}
Trainer Walt
quelle
0

TI-Basic, 40 Bytes

(In TI-BASIC sind viele Zeichen 2-Byte-Token, und Doppelpunkte am Zeilenanfang sind 0 zusätzliche Bytes.)

:ClrHome
:Output(1,6,":
:setTmFmt(24
:While 1
:Output(1,1,getTmSrr(0
:getTime
:Output(1,7,Ans(3
:End
Julian Lachniet
quelle
0

R, 41 Bytes

repeat{cat(format(Sys.time(),"%T"),"\r")}

Verfügt über ein nachfolgendes Leerzeichen (da das catStandardtrennzeichen ein Leerzeichen ist).
Aufgrund der Aktualisierungsrate der R-GUI werden beim Ausführen dieser Funktion in der GUI gelegentlich einige Sekunden übersprungen. Wenn Sie sie jedoch in einer Datei speichern und in der Befehlszeile ausführen, wird sie alle Sekunden korrekt angezeigt.
Läuft für immer, bis der Benutzer unterbricht.

Plannapus
quelle