Wyświetl zegar cyfrowy

20

Wyświetl zegar cyfrowy

(Widzę, że istnieje wiele wyzwań związanych z zegarem, próbowałem je wszystkie odczytać, jestem prawie pewien, że jest to wyjątkowy)

Wpisz kod, który stale aktualizuje cyfrowy zegar wyświetlany w formacie h:m:sgdzie h, mi smoże zająć 1 lub 2 znaków każdy. Ograniczenia w prostych słowach, jak to ujął @BlueEyedBeast, zasadniczo chcę, aby zastąpiło pokazany czas.

  • Nowe linie są niedozwolone
  • Końcowe spacje są dozwolone
  • Inne końcowe znaki są niedozwolone
  • Nie należy przegapić żadnych sekund (57 -> 59 nie jest dozwolone)
  • Numery rozpoczynające się od „0” są dozwolone, o ile nie zajmują więcej niż 2 znaki
  • Kod nie może akceptować żadnych danych wejściowych
  • Jeśli twój język nie może uzyskać aktualnego czasu bez wprowadzania danych, możesz użyć do wprowadzenia do 8 bajtów w standardowy dozwolony sposób
  • Dane wyjściowe muszą być ustawione na standardowe wyjście
  • To jest codegolf, więc wygrywa najkrótsza odpowiedź!

Przykład

Pracuję nad językiem o nazwie *> <> (rozgwiazda), ponieważ takie programy nie są możliwe w> <> (wystarczy poczekać na plik we / wy). Oto działający program zegara cyfrowego (bez golfa). Ten program jest napisany w *> <> :

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

Uwaga: w tym przypadku wszystko jest identyczne z> <>, z wyjątkiem s = sekunda, m = minuta, h = godzina, S = sen (100 ms * x)

To daje:

14:44:31

Aktualizowanie co 100 ms aż do zakończenia.

Niedozwolone przykłady

Następujące elementy nie są dozwolone:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

Czas musi pozostać w pierwszym wierszu, w którym został wygenerowany, bez widocznych znaków końcowych. Wyczyszczenie terminala byłoby jednak dozwolone, ponieważ nadal nie będzie żadnych znaków końcowych.

redstarcoder
źródło
1
czy musimy czekać 100 ms, czy możemy po prostu ciągle aktualizować na zawsze?
Niebieski,
1
nie musisz czekać, czekanie jest właśnie tym, co robi przykład.
redstarcoder,
2
Wymagania dotyczące wyzwania wydają mi się zbyt surowe.
mbomb007,
1
@ mbomb007 Usunąłem „Program musi być w stanie wyjść z wejścia użytkownika, który nie jest sygnałem / przerwaniem”, ponieważ obecne odpowiedzi i tak wydają się nie podążać za nim.
redstarcoder,
1
Czy program może polegać na określonych lokalnych ustawieniach systemu operacyjnego?
raznagul

Odpowiedzi:

5

Pyke, 6 bajtów

Ctr\ J

Wypróbuj tutaj!

Myślę, że to jest poprawne. Zamień znak spacji na znak powrotu karetki, aby uzyskać prawidłowe dane wyjściowe (nie działa online)

niebieski
źródło
Przepraszam, że nie. Po tym czasie nie są dozwolone nowe znaki ani końcowe znaki. Podam dwa przykłady, aby być bardziej wyraźnym.
redstarcoder,
Nie widzę tego w specyfikacji?
Niebieski,
1
W pierwszym wierszu jest napisane, że nowe wiersze są niedozwolone, w trzecim wierszu nie ma znaków końcowych. Przykro mi, jeśli jest to niejasne, byłbym wdzięczny za poradę, jak to naprawić.
redstarcoder,
Czy chcesz, aby zastąpił pokazany stary czas?
Blue
Tak, dokładnie! Twój obecny kod wydaje się idealny.
redstarcoder,
10

HTML + JS (ES6), 8 + 60 = 68 bajtów

Testowane w Chrome.

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

-1 bajt (@ETHProductions): Użyj francuskiego formatu czasu zamiast .toTimeString().slice(0,8)


HTML + JS (ES6), 8 + 62 = 70 bajtów

Będzie to działać w FireFox.

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

-3 bajty (@ETHProductions): Użyj francuskiego formatu czasu zamiast .toTimeString().slice(0,8)

darrylyeo
źródło
2
Jak to działa? Nigdy wcześniej nie widziałem składni backtick. Nic też nie mogę na nim znaleźć po krótkim wyszukiwaniu.
Carcigenicate
1
Pracuje dla mnie w Inox (Chromium)
redstarcoder
1
@Carcigenicate Jest to część najnowszej specyfikacji JavaScript, ECMAScript6. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
darrylyeo
@darrylyeo Dzięki. Mogłem znaleźć rzeczy w dosłownej składni, ale nie mogłem zobaczyć, w jaki sposób zostało tu zastosowane. Muszę ponownie przeczytać specyfikację. Nadal nie rozumiem, w jaki sposób używana jest funkcja poprzedzająca backtick.
Carcigenicate,
2
Możesz zapisać 3 bajty w Firefoksie za pomocą new Date().toLocaleTimeString`fr` (1 bajt w Chrome za pomocą ...TimeString('fr'))
ETHproductions
6

Python 2, 50 bajtów

(Python 2.1+ dla ctime bez argumentów)

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

time.ctime() daje sformatowany ciąg, z którego można pokroić hh: mm: ss za pomocą [11:19] (pozostaje on w tym samym miejscu bez względu na datę i godzinę).

printpowrót karetki '\r'przed tekstem i uczynienie z niego pierwszego elementu krotki, efektywnym pomijaniem ukrytego końca '\n'i nadpisuje poprzednio napisane wyjście.

while 1 pętle na zawsze.

Jonathan Allan
źródło
3
Myślę, że to wymaga ,końca, aby ukryć nowy wiersz, inaczej w Pythonie 2.7.12 otrzymuję nowe wiersze.
redstarcoder,
Ups, tak, masz rację ... zaktualizowano
Jonathan Allan
5

Mathematica, 48 41 37 28 bajtów

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

Wyjście będzie TimeObjectodświeżane w sposób ciągły.

Wygląda tak: enter image description here

Alternatywne wersje

48 bajtów:

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

53 bajty:

Dynamic@Refresh[DateString@"Time",UpdateInterval->.1]
JungHwan Min
źródło
1
Czy aktualizując się co sekundę, czy zapewniasz, że nigdy nie przeskakuje sekund? (Na przykład: 11:11:11 -> 11:11:13)
redstarcoder,
Dynamic@{DateString@TimeObject[], Clock[]}[[1]]
DavidC
1
@redstarcoder aktualizuje co ~ 1.002s, więc zmieniłem na aktualizację co 100ms
JungHwan Min
Welp, właśnie zdałem sobie sprawę, że tak naprawdę nie potrzebuję Pause.
JungHwan Min
Dynamic@{Now,Clock[]}[[1]]ma 26 bajtów i pokazuje obiekt typu data-godzina. Dynamic@{DateString@"Time",Clock[]}[[1]]ma 40 bajtów i wysyła tylko hh: mm: ss
Kelly Lowder
5

Widzę, że wymóg niesygnałowego wejścia interfejsu użytkownika do zatrzymania programu został usunięty. Teraz możemy zrobić:

Bash + coreutils, 28

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

yes nieprzerwanie wysyła ciąg „teraz”, raz na linię, do potoku.

date -f-odczytuje interpretuje każdy „teraz” jako bieżący czas, a następnie wyświetla w wymaganym formacie. Ciąg formatu zawiera sekwencję zmiany znaczenia ANSI, aby wyczyścić ekran. date robi wyjście znak nowej linii po dacie - Nie jestem pewien, czy to dyskwalifikuje, ponieważ wygaszenie ekranu za każdym razem, w każdym razie.

Jeśli to dyskwalifikuje, możemy użyć tr zamiast tego :

Bash + coreutils, 31

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

Poprzednie odpowiedzi:

Bash + X, 32

xclock -d -update 1 -strftime %T

Niestety może to być aktualizowane tylko co sekundę. Jeśli to dyskwalifikuje, możemy to zrobić zamiast tego:

Bash + coreutils, 43

until read -t0
do printf `date +%T`\\r
done
Cyfrowa trauma
źródło
Aktualizowanie co sekundę jest w porządku, o ile nigdy nie przeskakuje sekund (IE: 12-> 14).
redstarcoder,
Pozwolę na twoją nową linię! Nigdy nie spodziewałem się, że ta sprawa się wydarzy heh.
redstarcoder,
Czy to jest dozwolone? date +$'\e[2J'%T;$0
Evan Chen,
@EvanChen nie, ponieważ każda iteracja rekurencyjnie spawnuje nowy proces i ostatecznie zużyje dostępną pamięć lub przestrzeń PID, analogicznie do przepełnienia stosu. Jednak możesz zrobić date +$'\e[2J'%T;exec $0dla 24 bajtów ...
Digital Trauma
4

QBIC , 6 bajtów

{_C?_d

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

Ciągle czyści ekran i drukuje czas systemowy w formacie 22:03:41.

Steenbergh
źródło
3

Clojure, 150 136 141 bajtów

V3: 141 bajtów :(

+5 bajtów, aby naprawić błąd. Ponieważ czasy nie są wypełnione zerami, zegar może się „kurczyć” i rozszerzać, gdy zmienia się czas. Kiedy się skurczył, „rozmazywał się”, ponieważ ostatnia cyfra nie była już usuwana. Naprawiono to, dodając spacje na końcu, aby wszystko zostało zastąpione.

#(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 bajtów

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

-14 bajtów, przełączając SimpleDateFormatna formatowanie daty za pomocą. Wciąż ogromny.

V1: 150 bajtów

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

Uświadomiłem sobie, że prawdopodobnie używam najgorszego możliwego sposobu, aby uzyskać datę. Zdecydowanie miejsce na ulepszenia tutaj.

Nie golfowany:

(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))))
Carcigenicate
źródło
3

Bash + zegarek, 19 bajtów

zegarek nie jest częścią coreutils , ale jest dostępny po instalacji praktycznie na każdej dystrybucji Linuksa.

Grał w golfa

watch -tn1 date +%T

Wypróbuj online!

zepelin
źródło
2

WinDbg, 73 bajty

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

Ciągle aktualizuje linię z bieżącym czasem, dopóki użytkownik nie naciśnie Ctrl + Break.

Jak to działa:

.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

Przykładowe dane wyjściowe (masz pomysł):

0:000> .do{r$t0=0;.foreach(p {.echotime}){r$t0=@$t0+1;j8==@$t0'.printf"p \r"'}}1
14:10:12.329
mleko
źródło
2

PHP, 28 bajtów

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

dateWszystko druki funkcyjne dosłownie że doesnt rozpoznać.

\r jest znakiem powrotu karetki, ustawia kursor w pierwszej kolumnie.

Uruchom z -r.

Tytus
źródło
2

MATL , 11 bajtów

`XxZ'13XODT

Nieskończona pętla, która czyści ekran i drukuje czas w określonym formacie.

Możesz spróbować w MATL Online! . Ten kompilator jest eksperymentalny; jeśli to nie działa odśwież stronę i ponownie naciśnij „Uruchom”.

Luis Mendo
źródło
2

C #, 82 bajty

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

Anonimowa metoda, która nieustannie zastępuje 8 znaków nowym wynikiem. Może być skrócony o 1 bajt, jeśli zostanie zmodyfikowany, aby zaakceptować parametr zastępczy (z=>... ).

Pełny program:

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
źródło
1
Czy wolno nie importować System? Niektórzy to robią, a inni nie: /
Yytsi
Nie w swoim rzeczywistym rozwiązaniu, tylko w programie demonstracyjnym, więc tak, jest w porządku
Stefan
2

C #, 65 bajtów

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

Działa poprzez zastąpienie tej samej linii w nieskończonej pętli

Stefan
źródło
2

SmileBASIC 3.3.2, 38 bajtów

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

UTF-16 jest do bani :(

W każdym razie to wielokrotnie drukuje czas lokalny w GG: MM: SS ze spacją po nim, bez nowej linii później. Nie aktualizuje się co sekundę, po prostu drukuje wielokrotnie na zawsze.

ślimak_
źródło
Przepraszamy, to nie jest poprawne, musi zastąpić dane wyjściowe, to nie jest. Ustawienie pierwszej linii @L?TIME$i dodanie linii po (w sumie 3 liniach), która czyta, LOCATE 0, 0robi lewę (czy SmileBASIC obsługuje powrót karetki?).
redstarcoder
Zapomniałeś także o zdobyciu nowej linii, tworząc 40 bajtów (UTF-16 jest brutalny dla golfa kodowego). Możesz bardzo łatwo uzyskać długość znaków za pomocą Python REPL len(""" YOUR CODE HERE """), a następnie po prostu zrób * 2 dla UTF-16.
redstarcoder
Żaden SB nie robi CR właściwie, musiałbym tam umieścić LOCATE, które absolutnie zniszczyłyby mój wynik: P Lub CLS: VSYNC, który jest równie zły.
snail_
Tak, niestety bez tego rozwiązanie jest nieprawidłowe. Ale dobre wieści! SmileBASIC jest oceniany jako UTF-8 .
redstarcoder
2

C, 134 116 89 80 76 75 73 bajtów

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
źródło
It looks like (for me) you can remove time.h as well. This removes the time_t type, so you need to make n an int instead. This can be done by declaring it outside of main (like n;main...), which removes the need for the int. You can also get rid of the char with the same trick: b[9];main.... They're both int type now, but it's flexible enough.
nmjcman101
Wow, wielkie dzięki, nie wiedziałem, że to zadziała. Dziękuję
Stefan
Proszę przestać mnie jeśli chcesz golfowego to sam, ale również wyjął strftime...a b[9]i po prostu się drukiem w ten sposób: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); Nie jestem pewien, czy są potrzebne parens czy nie. Możesz także usunąć zestaw {}, wstawiając przecinki między for(;;)a,b,c;
wyciągami,
1
Te nawiasy są denerwujące. (n/60)%60, poważnie?
anatolyg
1
You can save 1 byte by declaring n as parameter of main, say main(n) instead of n;main()
Karl Napf
2

Powershell, 39 bytes

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

Because I dislike using cls in Powershell. From briantist's post @/codegolf//a/102450/63383

Daniel Cheng
źródło
2

Pascal, 61 bytes

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

Free pascal has nice time routines in SysUtils unit. Ungolfed:

uses
  sysutils;
begin
  while 1=1 do
    write(#13, timetostr(now));
end.
hdrz
źródło
2

C 65 (prev 64) bytes

Guaranteed to work on Linux machine. :)

@Marco Thanks!

f(){while(1){system("date +%T");usleep(100000);system("clear");}}
Abel Tom
źródło
1

Vim, 26 bytes

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

This creates a recursive macro (e.g. an eternal loop) that deletes all the text on the current line and replaces it with the current time.

DJMcMayhem
źródło
1

Pyth - 28 bytes

Kinda longish, because pyth has no strftime.

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

Groovy, 45 characters

for(;;)print(new Date().format("\rHH:mm:ss"))
manatwork
źródło
1

Jelly, 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

Try it online!

The carriage return doesn't work online, and I can't get the interpreter to work, so its kinda untested, but it works as expected when I use printable characters in place of the CR.

JayDepp
źródło
1

ForceLang, 123 bytes

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.toTimeString is backed in the reference implementation by Java's DateFormat.getTimeInstance(), which is locale-dependent, so you can set your default system locale to one that uses 24-hour time.

SuperJedi224
źródło
1

PowerShell, 30 28 24 20 bytes

Changed my computer's region to Germany based on raznagul's comment to save 4 bytes. :)

for(){date -F T;cls}

Previous version that works in all locales.

for(){date -F h:m:s;cls}
briantist
źródło
1

tcl, 69 bytes

while 1 {puts -nonewline \r[clock format [clock seconds] -format %T]}

Try it here!

sergiol
źródło
0

Batch, 36 bytes

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

Where represents the ASCII BS character (code 8).

Neil
źródło
0

Racket, 71 bytes

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

Where the is actually a CR (hex 0d). Hex dump of the program for further clarification (notice byte at 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

Uses SRFI/19 included with the Racket distribution. (current-date) gets the current local date & time. The date->string format ~3 is ISO-8601 hour-minute-second format. (let l () ... (l)) in an idiomatic infinite loop. (require srfi/19) loads the srfi/19 module.

Winny
źródło
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
źródło
0

TI-Basic, 40 Bytes

(In TI-BASIC, many characters are 2 byte tokens, and colons at the beginning of a line are 0 extra bytes)

:ClrHome
:Output(1,6,":
:setTmFmt(24
:While 1
:Output(1,1,getTmSrr(0
:getTime
:Output(1,7,Ans(3
:End
Julian Lachniet
źródło
0

R, 41 bytes

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

Has one trailing space (because of cat default separator being a space).
Because of the refresh rate of the R GUI, running this in the GUI will occasionally skip some seconds, but if you save it to a file and run it on the command line it will display correctly every single seconds.
Will run forever until user interrupt.

plannapus
źródło