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.


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)


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)


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.


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]

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

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.


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))))

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!


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

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.


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".


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();
    }
}

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


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.


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);}}

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

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.

2

C 65 (vorige 64) Bytes

Funktioniert garantiert auf Linux-Rechnern. :)

@ Marco Danke!

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

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.


1

Pyth - 28 Bytes

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

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


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.


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.


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}


0

Batch, 36 Bytes

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

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


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.


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);}}

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.