Dijital Saat Göster


20

Dijital Saat Göster

(Saat zorlukları olduğunu görüyorum, hepsini okumaya çalıştım, bunun benzersiz olduğuna eminim)

Sürekli biçimde görüntülenir bir dijital saat günceller bazı kodlar yaz h:m:snereye h, mves 1 veya 2 karakter her doldurabilir. @BlueEyedBeast koyduğu gibi basit terimlerle kısıtlamalar, temelde gösterilen zamanı değiştirmek istiyorum.

  • Yeni satırlara izin verilmiyor
  • Sondaki boşluklara izin verilir
  • Diğer sondaki karakterlere izin verilmiyor
  • Hiçbir saniye kaçırılmamalıdır (57 -> 59'a izin verilmez)
  • "0" ile başlayan sayılara, 2 karakterden fazla yer almadıkları sürece izin verilir
  • Kod herhangi bir girişi kabul etmemelidir
  • Diliniz geçerli saati girilmeden alamıyorsa, standart olarak izin verilen bir şekilde 8 bayta kadar giriş için kullanabilirsiniz
  • Çıktı stdout olmalıdır
  • Bu kodgolf, bu yüzden en kısa cevap kazanıyor!

Misal

*> <> (Denizyıldızı) adlı bir dil üzerinde çalışıyorum çünkü bu tür programlar> <> 'da mümkün değil (sadece dosya i / o'yu bekleyin). İşte içinde çalışan bir dijital saat programı (ungolfed). Bu program *> <> dilinde yazılmıştır :

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

Not: s = saniye, m = dakika, h = saat, S = uyku (100 ms * x) hariç, her şey bunun içinde <<> ile aynıdır.

Bu çıktılar:

14:44:31

Sonlandırılana kadar her 100 ms'de bir güncellenir.

İzin Verilmeyen Örnekler

Aşağıdakilere izin verilmez:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

Zaman, görünür izleyen karakter olmadan çıktısının alındığı ilk satırda kalmalıdır. Yine de terminalin temizlenmesine izin verilecekti, çünkü hala takip eden karakterler olmayacaktı.


1
100ms beklemek zorunda mıyız yoksa sonsuza dek sürekli güncelleyebilir miyiz?
Blue

1
beklemek zorunda değilsiniz, beklemek sadece örnektir.
redstarcoder

2
Zorluk gereksinimleri benim için çok katı görünüyor.
mbomb007

1
@ mbomb007 Şu anki yanıtlar zaten onu takip etmediği için "Program bir sinyal / kesinti olmayan kullanıcı girişinden çıkabilmelidir."
redstarcoder

1
Program, işletim sisteminin belirli bir yerel ayarına güvenebilir mi?
raznagul

Yanıtlar:


5

Pyke, 6 bayt

Ctr\ J

Burada deneyin!

Bunun geçerli olduğunu düşünüyorum. Geçerli çıktı için boşluk karakterini satır başı ile değiştirin (çevrimiçi çalışmaz)


Üzgünüm değil. Süre geçtikten sonra yeni satırlara izin verilmez veya karakterlerin sonuna gelmez. Daha açık olmak için 2 örnek vereceğim.
redstarcoder

Spesifikasyonda görmüyorum?
Blue

1
İlk satırda yeni satırlara izin verilmiyor, üçüncüsünde de arkada hiçbir karakter yok. Bu belirsizse özür dilerim, düzeltmek için tavsiye ederim.
redstarcoder

Peki gösterilen eski zamanın yerini almasını mı istiyorsunuz?
Blue

Evet kesinlikle! Mevcut kodunuz mükemmel görünüyor.
redstarcoder

10

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

Chrome'da test edildi.

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

-1 bayt (@ETHProductions): Fransızca saat biçimini kullan yerine .toTimeString().slice(0,8)


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

Bu FireFox'ta çalışacaktır.

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

-3 bayt (@ETHProductions): Fransızca saat biçimini kullan yerine .toTimeString().slice(0,8)


2
Bu nasıl çalışıyor? Daha önce hiç backtick sözdizimini görmedim. Bazı hızlı aramalardan sonra da hiçbir şey bulamıyorum.
16'da Carcigenicate

1
Inox (Chromium) benim için çalışıyor
redstarcoder

1
@Carcigenicate En son JavaScript spesifikasyonu ECMAScript6'nın bir parçasıdır. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
darrylyeo

@darrylyeo Teşekkürler. Gerçek sözdiziminde bir şeyler bulabilirdim, ancak burada nasıl uygulandığını göremedim. Spesifikasyonu tekrar okumam gerekiyor. Hala ters çividen önceki fonksiyonun nasıl kullanıldığını anlamıyorum.
16'da Carcigenicate

2
Firefox'ta 3 bayt ile new Date().toLocaleTimeString`fr` (Chrome'da 1 bayt ile ...TimeString('fr'))
kaydedebilirsiniz

6

Python 2, 50 bayt

( ctimeTartışmasız Python 2.1+ )

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

time.ctime() hh: mm: ss kullanılarak dilimlenebilen biçimlendirilmiş bir dize verir [11:19] (tarih ve saat ne olursa olsun aynı yerde kalır).

print'\r'metnin önüne satır başının döndürülmesi ve metnin ,, örtülü izlemeyi etkin bir şekilde bastıran bir demetin ilk öğesi haline getirmesi '\n've daha önce yazılan çıktının üzerine yazılması.

while 1 sonsuza kadar döngüler.


3
Bence bu ,sonunda bir satırsonu bastırmak için bir ihtiyaç gerekiyor Python 2.7.12 de satırsonu olsun.
redstarcoder

Hata! Evet, haklısın ... güncellendi
Jonathan Allan

5

Mathematica, 48 41 37 28 bayt

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

Çıktı bir TimeObject sürekli yenilenerek .

Buna benzer: enter image description here

Alternatif versiyonlar

48 bayt:

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

53 bayt:

Dynamic@Refresh[DateString@"Time",UpdateInterval->.1]

1
Her saniye güncellenmesiyle, hiçbir zaman saniye atlamamasını sağladınız mı? (Örn: 11:11:11 -> 11:11:13)
redstarcoder

Dynamic@{DateString@TimeObject[], Clock[]}[[1]]
DavidC

1
@ redstarcoder her ~ 1.002 saniyede bir güncellenir, bu yüzden her 100 ms güncelleme için değiştirdim
JungHwan Min

Welp, aslında ihtiyacım olmadığını fark ettim Pause.
JungHwan Min

Dynamic@{Now,Clock[]}[[1]]26 bayttır ve datetime nesnesini gösterir. Dynamic@{DateString@"Time",Clock[]}[[1]]40 bayt ve yalnızca çıkış ss: dd: ss
Kelly Lowder

5

Programı durdurmak için sinyalsiz bir UI girişi gereksiniminin kaldırıldığını görüyorum. Şimdi yapabiliriz:

Bash + coreutils, 28

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

yes "Şimdi" dizesini sürekli olarak her satıra bir boruya verir.

date -f-okur, her "şimdi" yi geçerli saat olarak yorumlar, ardından istenen formatta çıktı verir. Biçim dizesi, ekranı temizlemek için ANSI çıkış sırasını içerir. date yapar çıkış tarihinden sonra yeni satır - Ben değilim emin eğer ekran Zaten her zaman temizlenir beri bu kaybedeceğinizi.

Diskalifiye olursa, trbunun yerine kullanabiliriz :

Bash + coreutils, 31

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

Önceki Cevaplar:

Bash + X, 32

xclock -d -update 1 -strftime %T

Ne yazık ki bu sadece her saniyede bir güncellenebilir. Bu diskalifiye olursa, bunun yerine bunu yapabiliriz:

Bash + coreutils, 43

until read -t0
do printf `date +%T`\\r
done

Saniyeyi atlamadığı sürece her saniye güncelleme iyidir (IE: 12-> 14).
redstarcoder

Yeni satıcınıza izin vereceğim! Bu davanın olmasını beklemiyordum heh.
redstarcoder

Buna izin veriliyor mu? date +$'\e[2J'%T;$0
Evan Chen

@EvanChen hayır, çünkü her yineleme yinelemeli olarak yeni bir süreç oluşturur ve nihayetinde bir yığın taşmasına benzer şekilde kullanılabilir bellek veya PID alanı kullanır. Ancak date +$'\e[2J'%T;exec $024 bayt için yapabilirsiniz ...
Dijital Travma

4

QBIC , 6 bayt

{_C?_d

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

Ekranı sürekli olarak temizler ve sistem saatini formatta yazdırır 22:03:41.


3

Clojure, 150 136 141 bayt

V3: 141 bayt :(

Bir hatayı düzeltmek için +5 bayt. Zamanlar sıfır dolgulu olmadığından, saat değiştiğinde saat "büzülebilir" ve genişleyebilir. Küçüldüğünde "bulaşıyordu", çünkü son rakam artık silinmemiştir. Her şeyin üzerine yazıldığından emin olmak için sonunda boşluklar ekleyerek düzeltildi.

#(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 bayt

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

SimpleDateFormatTarihi biçimlendirmek için kullanarak -14 bayt . Hala çok büyük.

V1: 150 bayt

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

Tarihi almak için muhtemelen en kötü yolu kullandığımı fark ettim. Burada iyileştirme için kesinlikle yer.

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 + saat, 19 bayt

watch , coreutils'in bir parçası değildir , ancak neredeyse her Linux dağıtımında kullanıma hazırdır.

golfed

watch -tn1 date +%T

Çevrimiçi deneyin!


2

WinDbg, 73 bayt

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

Kullanıcı Ctrl + Break tuşlarına basana kadar bir satırı geçerli saatle sürekli günceller.

Nasıl çalışır:

.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

Örnek çıktı (iyi, fikir olsun):

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 bayt

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

dateTanımadığı gelmiyor.Fark tam anlamıyla o fonksiyon baskılar her şeyi.

\r satır başı, imleci ilk sütuna ayarlar.

İle çalıştırın -r.


2

MATL , 11 bayt

`XxZ'13XODT

Ekranı temizleyen ve zamanı belirtilen formatta basan sonsuz döngü.

MATL Online'da deneyebilirsiniz ! . Bu derleyici deneyseldir; çalışmazsa sayfayı yenileyin ve tekrar "Çalıştır" a basın.


2

C #, 82 bayt

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

Yeni çıktı ile sürekli olarak 8 karakterin üzerine yazan anonim yöntem. Sahte bir parametreyi kabul etmek için değiştirilirse 1 bayt daha kısa yapılabilir (z=>... ) .

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

1
İçe aktarmama izin var mı System? Bazı insanlar bunu yapar ve bazı insanlar yapmaz: /
Yytsi

Gerçek çözümünde, sadece demo programında yoktu, bu yüzden evet, sorun değil
Stefan

2

C #, 65 bayt

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

Sonsuz bir döngü içinde aynı satırın üzerine yazarak çalışır


2

SmileBASIC 3.3.2, 38 bayt

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

UTF-16 berbat :(

Her neyse, bu art arda HH: MM: SS'de yerel saati tekrar basıyor, sonrasında boşluk yok. Yine de her saniye güncellenmiyor, sadece tekrar tekrar sonsuza kadar yazdırıyor.


Maalesef bu geçerli değil, çıktıyı değiştirmeniz gerekiyor, bu değil. İlk satırı ayarlamak ve @L?TIME$sonra bir satır eklemek (toplam 3 satır için) LOCATE 0, 0hile yapar (SmileBASIC taşıyıcıyı geri döndürür mü?).
redstarcoder

Ayrıca bu 40 bayt yaparak yeni çizgiyi puanlamayı unuttun (UTF-16, kod golfü için acımasızdır). Python REPL ile karakter uzunluğunu çok kolay bir şekilde elde edebilirsiniz len(""" YOUR CODE HERE """), sonra UTF-16 için * 2 yapın.
redstarcoder

Hiçbir SB aslında CR yapmaz, ben kesinlikle puanımı yok edecek bir LOCATE deyimi bırakmak zorunda kalacaktı: P Veya bir CLS: VSYNC gibi kötü.
snail_

Evet, ne yazık ki bu çözüm onsuz geçersiz. Yine de iyi haber! SmileBASIC, UTF-8 olarak puanlanmıştır .
redstarcoder

2

C, 134 116 89 80 76 75 73 bayt

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

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, thanks a lot, I didn't know this would work. Thank you
Stefan

Please stop me if you'd like to golf it yourself, but I also took out the strftime... and the b[9] and just made print into this: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); I'm not sure if the parens are needed or not. Also you can take out a set of {} by putting commas between your statements so it's for(;;)a,b,c;
nmjcman101

1
These parentheses are annoying. (n/60)%60, seriously?
anatolyg

1
You can save 1 byte by declaring n as parameter of main, say main(n) instead of n;main()
Karl Napf


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.

2

C 65 (prev 64) bytes

Guaranteed to work on Linux machine. :)

@Marco Thanks!

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

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.


1

Pyth - 28 bytes

Kinda longish, because pyth has no strftime.

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

1

Groovy, 45 characters

for(;;)print(new Date().format("\rHH:mm:ss"))

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.


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.


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}


0

Batch, 36 bytes

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

Where represents the ASCII BS character (code 8).


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.


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

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.