Tampilkan Jam Digital

20

Tampilkan Jam Digital

(Saya melihat ada banyak tantangan jam, saya telah mencoba membaca semuanya, saya cukup yakin ini unik)

Menulis beberapa kode yang terus update jam digital ditampilkan dalam format h:m:smana h, mdan sdapat menempati 1 atau 2 karakter masing-masing. Batasan-batasan dalam istilah sederhana seperti yang dikatakan @BlueEyedBeast, saya pada dasarnya ingin mengganti waktu yang ditampilkan.

  • Baris baru tidak diizinkan
  • Ruang tambahan diperbolehkan
  • Karakter tambahan lainnya tidak diperbolehkan
  • Tidak ada detik yang terlewatkan (57 -> 59 tidak diizinkan)
  • Angka yang dimulai dengan "0" diizinkan, asalkan angka tersebut tidak melebihi 2 karakter
  • Kode tidak boleh menerima input apa pun
  • Jika bahasa Anda tidak bisa mendapatkan waktu saat ini tanpa input, Anda dapat menggunakan untuk input hingga 8 byte dengan cara yang diizinkan secara standar
  • Keluaran harus stdout
  • Ini codegolf sehingga jawaban terpendek menang!

Contoh

Saya sedang mengerjakan bahasa bernama *> <> (bintang laut) karena program seperti ini tidak mungkin di> <> (tunggu saja file i / o). Berikut adalah program jam digital yang berfungsi di dalamnya (ungolfed). Program ini ditulis dalam *> <> :

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

Catatan: Semuanya identik dengan> <> kecuali, s = detik, m = menit, h = jam, S = tidur (100 ms * x)

Output ini:

14:44:31

Memperbarui setiap 100 ms hingga dihentikan.

Contoh yang Dilarang

Berikut ini tidak diizinkan:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

Waktu harus tetap pada baris pertama yang dihasilkan tanpa karakter trailing yang terlihat. Menghapus terminal, akan diizinkan karena masih tidak memiliki karakter tambahan.

redstarcoder
sumber
1
apakah kita harus menunggu 100 ms atau bisakah kita terus memperbarui selamanya?
Biru
1
Anda tidak harus menunggu, menunggu persis seperti contohnya.
redstarcoder
2
Persyaratan tantangan tampaknya terlalu ketat bagi saya.
mbomb007
1
@ mbomb007 Saya menghapus "Program ini harus dapat keluar pada input pengguna yang bukan sinyal / interupsi" karena jawaban saat ini sepertinya tidak mengikutinya.
redstarcoder
1
Bisakah program mengandalkan pengaturan lokal spesifik OS?
raznagul

Jawaban:

5

Pyke, 6 byte

Ctr\ J

Coba di sini!

Saya pikir ini valid. Ganti karakter ruang dengan carriage return untuk output yang valid (tidak berfungsi online)

Biru
sumber
Maaf bukan. Tidak ada baris baru yang diizinkan atau tertinggal karakter setelah waktu tersebut. Saya akan berikan 2 contoh untuk lebih eksplisit.
redstarcoder
Saya tidak melihat itu di spec?
Biru
1
Baris pertama mengatakan baris baru tidak diperbolehkan, baris ketiga mengatakan tidak ada karakter tambahan. Maaf jika itu tidak jelas, saya menghargai saran untuk memperbaikinya.
redstarcoder
Jadi Anda ingin mengganti waktu lama yang ditampilkan?
Biru
Ya persis! Kode Anda saat ini tampaknya sempurna.
redstarcoder
10

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

Diuji di Chrome.

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

-1 byte (@ETHProductions): Gunakan format waktu Prancis sebagai ganti .toTimeString().slice(0,8)


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

Ini akan bekerja di FireFox.

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

-3 byte (@ETHProductions): Gunakan format waktu Prancis sebagai ganti .toTimeString().slice(0,8)

Darrylyeo
sumber
2
Bagaimana cara kerjanya? Saya belum pernah melihat sintaks backtick sebelumnya. Saya tidak dapat menemukan apa pun di sana setelah beberapa pencarian cepat.
Carcigenicate
1
Bekerja untuk saya di Inox (Chromium)
redstarcoder
1
@Carcigenicate Ini bagian dari spesifikasi JavaScript terbaru, ECMAScript6. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
darrylyeo
@dryrylyeo Terima kasih. Saya dapat menemukan hal-hal pada sintaksis literal, tetapi saya tidak dapat melihat bagaimana itu diterapkan di sini. Saya perlu membaca spek lagi. Saya masih tidak mengerti bagaimana fungsi yang mendahului backtick digunakan.
Carcigenicate
2
Anda dapat menyimpan 3 byte di Firefox satu dengan new Date().toLocaleTimeString`fr` (1 byte di Chrome satu dengan ...TimeString('fr'))
ETHproduk
6

Python 2, 50 byte

(Python 2.1+ ctimetanpa argumen)

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

time.ctime()menghasilkan string yang diformat, dari mana jj: mm: dd dapat diiris menggunakan [11:19](itu tetap di lokasi yang sama apa pun tanggal dan waktu).

printing carriage return '\r'sebelum teks dan menjadikan teks item pertama tuple dengan ,secara efektif menekan trailing implisit '\n'dan menimpa output yang ditulis sebelumnya.

while 1 loop selamanya.

Jonathan Allan
sumber
3
Saya pikir ini perlu ,di akhir untuk menekan baris baru jika tidak di Python 2.7.12 saya mendapatkan baris baru.
redstarcoder
Ups, ya, Anda benar ... diperbarui
Jonathan Allan
5

Mathematica, 48 41 37 28 byte

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

Output akan menjadi TimeObject, menyegarkan terus menerus.

Terlihat seperti ini: masukkan deskripsi gambar di sini

Versi alternatif

48 byte:

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

53 byte:

Dynamic@Refresh[DateString@"Time",UpdateInterval->.1]
JungHwan Min
sumber
1
Dengan itu memperbarui setiap detik, apakah Anda memastikan tidak pernah melewatkan detik? (Kel: 11:11:11 -> 11:11:13)
redstarcoder
Dynamic@{DateString@TimeObject[], Clock[]}[[1]]
DavidC
1
@redstarcoder memperbarui setiap ~ 1.002s, jadi saya berubah untuk memperbarui setiap 100ms
JungHwan Min
Wah, saya baru sadar saya sebenarnya tidak perlu Pause.
JungHwan Min
Dynamic@{Now,Clock[]}[[1]]adalah 26 byte dan menunjukkan objek datetime. Dynamic@{DateString@"Time",Clock[]}[[1]]adalah 40 byte dan keluaran hanya jj: mm: dd
Kelly Lowder
5

Saya melihat bahwa persyaratan untuk input UI non-sinyal untuk menghentikan program telah dihapus. Jadi sekarang kita bisa melakukan:

Bash + coreutils, 28

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

yes terus menerus mengeluarkan string "sekarang", sekali per baris, ke dalam pipa.

date -f-membaca setiap kata "sekarang" sebagai waktu saat ini, kemudian menghasilkan dalam format yang diperlukan. String format menyertakan urutan pelarian ANSI untuk menghapus layar. date memang menampilkan baris baru setelah tanggal - Saya tidak yakin apakah ini mendiskualifikasi, karena layar dibersihkan setiap saat.

Jika itu didiskualifikasi, maka kita bisa menggunakan tr:

Bash + coreutils, 31

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

Jawaban Sebelumnya:

Bash + X, 32

xclock -d -update 1 -strftime %T

Sayangnya ini hanya dapat memperbarui setiap detik. Jika itu didiskualifikasi, maka kita dapat melakukan ini sebagai gantinya:

Bash + coreutils, 43

until read -t0
do printf `date +%T`\\r
done
Trauma Digital
sumber
Memperbarui setiap detik baik-baik saja, asalkan tidak pernah melewati detik (IE: 12-> 14).
redstarcoder
Saya akan mengizinkan baris baru Anda! Saya tidak pernah berharap kasus ini terjadi heh.
redstarcoder
Apakah ini diizinkan? date +$'\e[2J'%T;$0
Evan Chen
@VanChen tidak, karena setiap iterasi secara rekursif memunculkan proses baru dan pada akhirnya akan menggunakan memori yang tersedia atau ruang PID, analog dengan stack overflow. Namun Anda bisa melakukannya date +$'\e[2J'%T;exec $0selama 24 byte ...
Digital Trauma
4

QBIC , 6 byte

{_C?_d

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

Terus membersihkan layar dan mencetak waktu sistem dalam format 22:03:41.

steenbergh
sumber
3

Clojure, 150 136 141 byte

V3: 141 byte :(

+5 byte untuk memperbaiki bug. Karena waktu bukan nol padded, jam dapat "menyusut" dan berkembang ketika waktu berubah. Itu "mengotori" ketika menyusut karena digit terakhir tidak lagi dibersihkan. Memperbaikinya dengan menambahkan beberapa spasi di akhir untuk memastikan semuanya ditimpa.

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

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

-14 byte dengan beralih menggunakan SimpleDateFormatformat tanggal. Masih besar.

V1: 150 byte

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

Saya menyadari bahwa saya mungkin menggunakan cara terburuk untuk mendapatkan kencan. Pasti ruang untuk perbaikan di sini.

Tidak Terkumpul:

(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
sumber
3

Bash + watch, 19 byte

Arloji bukan bagian dari coreutils , tetapi tersedia di luar kotak pada hampir setiap distro Linux.

Golf

watch -tn1 date +%T

Cobalah online!

zeppelin
sumber
2

WinDbg, 73 byte

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

Itu terus memperbarui garis dengan waktu saat ini sampai pengguna menekan Ctrl + Break.

Bagaimana itu bekerja:

.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

Contoh hasil (baik, Anda mendapatkan ide):

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

PHP, 28 byte

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

The datefungsi cetak segala sesuatu secara harfiah bahwa doesnt mengenali.

\r adalah carriage return, atur kursor ke kolom pertama.

Jalankan dengan -r.

Titus
sumber
2

MATL , 11 byte

`XxZ'13XODT

Infinite loop yang membersihkan layar dan mencetak waktu dalam format yang ditentukan.

Anda dapat mencobanya di MATL Online! . Kompiler ini bersifat eksperimental; jika tidak berhasil menyegarkan halaman dan tekan "Run" lagi.

Luis Mendo
sumber
2

C #, 82 byte

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

Metode anonim yang terus-menerus menimpa 8 karakter dengan output baru. Dapat dibuat 1 byte lebih pendek jika memodifikasi untuk menerima parameter dummy ( z=>...).

Program lengkap:

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
sumber
1
Apakah diizinkan untuk tidak mengimpor System? Beberapa orang melakukannya, dan beberapa orang tidak: /
Yytsi
Dia tidak dalam solusi aktualnya, hanya dalam program demo, jadi ya, tidak apa
Stefan
2

C #, 65 byte

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

Bekerja dengan menimpa baris yang sama dalam satu lingkaran tanpa akhir

Stefan
sumber
2

SmileBASIC 3.3.2, 38 bytes

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

UTF-16 menyebalkan :(

Bagaimanapun, ini berulang kali mencetak waktu lokal di HH: MM: SS dengan spasi setelahnya, tidak ada baris baru sesudahnya. Itu tidak memperbarui setiap detik, hanya berulang kali mencetak selamanya.

siput_
sumber
Maaf ini tidak valid, perlu mengganti output, ini tidak. Mengatur baris pertama ke @L?TIME$dan menambahkan baris setelah (untuk total 3 baris) yang berbunyi LOCATE 0, 0tidak trik (apakah SmileBASIC mendukung carriage kembali?).
redstarcoder
Anda juga lupa untuk mencetak baris baru, membuat ini 40 byte (UTF-16 brutal untuk kode golf). Anda bisa mendapatkan panjang karakter dengan sangat mudah melalui Python REPL len(""" YOUR CODE HERE """), lalu cukup lakukan * 2 untuk UTF-16.
redstarcoder
Tidak SB tidak melakukan CR sebenarnya, saya harus menjatuhkan pernyataan LOCATE ke sana yang benar-benar akan menghancurkan skor saya: P Atau CLS: VSYNC yang sama buruknya.
snail_
Ya, sayangnya solusi ini tidak valid tanpanya. Kabar baiknya! SmileBASIC dinilai sebagai UTF-8 .
redstarcoder
2

C, 134 116 89 80 76 75 73 byte

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
sumber
Sepertinya (bagi saya) Anda dapat menghapus time.hjuga. Ini menghapus tipe time_t, jadi Anda perlu membuat n int sebagai gantinya. Ini dapat dilakukan dengan mendeklarasikannya di luar main (seperti n;main...), yang menghilangkan kebutuhan untuk int. Anda juga dapat menyingkirkan chardengan trik yang sama: b[9];main.... Mereka berdua tipe int sekarang, tapi cukup fleksibel.
nmjcman101
Wow, terima kasih banyak, saya tidak tahu ini akan berhasil. Terima kasih
Stefan
Tolong hentikan saya jika Anda ingin bermain golf sendiri, tetapi saya juga mengeluarkan strftime...dan b[9]dan mencetaknya di sini: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); Saya tidak yakin apakah orangtua perlu atau tidak. Anda juga dapat menghapus serangkaian {}dengan menempatkan koma di antara pernyataan Anda sehinggafor(;;)a,b,c;
nmjcman101
1
Tanda kurung ini menyebalkan. (n/60)%60serius
anatolyg
1
Anda dapat menyimpan 1 byte dengan mendeklarasikan nsebagai parameter main, katakanlah main(n)bukann;main()
Karl Napf
2

Powershell, 39 byte

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

Karena saya tidak suka menggunakan cls di Powershell. Dari posting briantist @ /codegolf//a/102450/63383

Daniel Cheng
sumber
2

Pascal, 61 byte

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

Pascal gratis memiliki rutinitas waktu yang baik di unit SysUtils. Tidak Terkumpul:

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

C 65 (sebelumnya 64) byte

Dijamin bekerja di mesin Linux. :)

@ Marsco, Terima kasih!

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

Vim, 26 byte

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

Ini menciptakan makro rekursif (misal loop abadi) yang menghapus semua teks pada baris saat ini dan menggantinya dengan waktu saat ini.

DJMcMayhem
sumber
1

Pyth - 28 byte

Agak gondrong, karena pyth tidak memiliki strftime.

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

Groovy, 45 karakter

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

Jelly , 8 byte

13Ọ7ŒTȮß

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

Cobalah online!

Pengembalian carriage tidak berfungsi online, dan saya tidak bisa membuat penerjemah bekerja, jadi ini agak tidak teruji, tetapi berfungsi seperti yang diharapkan ketika saya menggunakan karakter yang dapat dicetak sebagai ganti CR.

JayDepp
sumber
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.toTimeStringdidukung dalam implementasi referensi oleh Java DateFormat.getTimeInstance(), yang bergantung pada lokal, sehingga Anda dapat mengatur lokal sistem default Anda ke yang menggunakan waktu 24 jam.

SuperJedi224
sumber
1

PowerShell, 30 28 24 20 byte

Mengubah wilayah komputer saya ke Jerman berdasarkan komentar raznagul untuk menghemat 4 byte. :)

for(){date -F T;cls}

Versi sebelumnya yang berfungsi di semua lokal.

for(){date -F h:m:s;cls}
briantis
sumber
1

tcl, 69 byte

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

Coba di sini!

sergiol
sumber
0

Batch, 36 byte

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

Dimana mewakili karakter ASCII BS (kode 8).

Neil
sumber
0

Racket, 71 byte

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

Di mana sebenarnya CR (hex 0d). Hex dump dari program untuk klarifikasi lebih lanjut (perhatikan byte pada posisi 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

Penggunaan SRFI / 19 termasuk dalam distribusi Racket. (current-date)dapatkan tanggal & waktu setempat saat ini. The date->stringFormat ~3adalah ISO-8601 jam menit detik format. (let l () ... (l))dalam loop tak terbatas idiomatik. (require srfi/19)memuat srfi/19modul.

Winny
sumber
0

C, 156 byte

#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);}}
Pelatih Walt
sumber
0

TI-Basic, 40 Bytes

(Dalam TI-BASIC, banyak karakter adalah token 2 byte, dan titik dua pada awal baris adalah 0 byte tambahan)

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

R, 41 byte

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

Memiliki satu spasi tambahan (karena catpemisah default berupa spasi).
Karena kecepatan refresh dari GUI R, menjalankan ini di GUI kadang-kadang akan melewatkan beberapa detik, tetapi jika Anda menyimpannya ke file dan menjalankannya di baris perintah itu akan ditampilkan dengan benar setiap detik.
Akan berjalan selamanya sampai interupsi pengguna.

plannapus
sumber