Hiển thị đồng hồ kỹ thuật số


20

Hiển thị đồng hồ kỹ thuật số

(Tôi thấy có nhiều thử thách đồng hồ. Tôi đã cố gắng đọc tất cả. Tôi chắc chắn điều này là duy nhất)

Viết một số mã liên tục cập nhật một đồng hồ kỹ thuật số hiển thị trong định dạng h:m:snơi h, mscó thể chiếm 1 hoặc 2 ký tự mỗi người. Các hạn chế trong các điều khoản đơn giản như @BlueEyedBeast đặt nó, về cơ bản tôi muốn nó thay thế thời gian hiển thị.

  • Dòng mới không được phép
  • Không gian lưu trữ được cho phép
  • Các ký tự khác không được phép
  • Không nên bỏ qua giây nào (57 -> 59 không được phép)
  • Các số bắt đầu bằng "0" được cho phép, miễn là chúng không chiếm hơn 2 ký tự
  • Mã không được chấp nhận bất kỳ đầu vào
  • Nếu ngôn ngữ của bạn không thể có được thời gian hiện tại mà không có đầu vào, bạn có thể sử dụng cho đầu vào tối đa 8 byte theo cách được phép chuẩn
  • Đầu ra phải là thiết bị xuất chuẩn
  • Đây là codegolf nên câu trả lời ngắn nhất sẽ thắng!

Thí dụ

Tôi đang làm việc với một ngôn ngữ có tên *> <> (sao biển) vì các chương trình như thế này không khả dụng trong> <> (chỉ cần đợi tệp i / o). Đây là một chương trình đồng hồ kỹ thuật số đang hoạt động trong đó (chưa được chỉnh sửa). Chương trình này được viết bằng *> <> :

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

Lưu ý: Mọi thứ đều giống hệt với> <> trong trường hợp này ngoại trừ, s = giây, m = phút, h = giờ, S = ngủ (100ms * x)

Kết quả này:

14:44:31

Cập nhật cứ sau 100ms cho đến khi chấm dứt.

Ví dụ không được phép

Những điều sau đây không được phép:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

Thời gian phải ở trên dòng đầu tiên, nó được xuất ra mà không có ký tự dấu vết có thể nhìn thấy. Tuy nhiên, việc xóa thiết bị đầu cuối sẽ được cho phép vì vẫn không có bất kỳ ký tự dấu.


1
chúng ta phải đợi 100ms hay chúng ta có thể cập nhật liên tục mãi mãi?
Màu xanh

1
bạn không cần phải chờ đợi, sự chờ đợi chỉ là những gì ví dụ làm.
redstarcoder

2
Các yêu cầu thử thách dường như quá nghiêm ngặt đối với tôi.
mbomb007

1
@ mbomb007 Tôi đã xóa "Chương trình phải có thể thoát khỏi đầu vào của người dùng không phải là tín hiệu / ngắt" vì các câu trả lời hiện tại dường như không tuân theo dù sao đi nữa.
redstarcoder

1
Chương trình có thể dựa vào một cài đặt cục bộ cụ thể của HĐH không?
raznagul

Câu trả lời:


5

Pyke, 6 byte

Ctr\ J

Hãy thử nó ở đây!

Tôi nghĩ rằng điều này là hợp lệ. Thay thế ký tự khoảng trắng bằng trả về vận chuyển cho đầu ra hợp lệ (không hoạt động trực tuyến)


Xin lỗi không phải vậy. Không có dòng mới được cho phép hoặc theo dõi các ký tự sau thời gian. Tôi sẽ đặt 2 ví dụ để rõ ràng hơn.
redstarcoder

Tôi không thấy điều đó trong thông số kỹ thuật?
Màu xanh

1
Dòng đầu tiên cho biết dòng mới không được phép, dòng thứ ba nói không có ký tự dấu. Tôi xin lỗi nếu điều đó không rõ ràng, tôi đánh giá cao lời khuyên về việc sửa nó.
redstarcoder

Vì vậy, bạn muốn nó thay thế thời gian cũ hiển thị?
Màu xanh

Đúng chính xác! Mã hiện tại của bạn có vẻ hoàn hảo.
redstarcoder

10

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

Đã thử nghiệm trong Chrome.

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

-1 byte (@ETH sản phẩm): Sử dụng định dạng thời gian của Pháp thay vì .toTimeString().slice(0,8)


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

Điều này sẽ hoạt động trong FireFox.

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

-3 byte (@ETH sản phẩm): Sử dụng định dạng thời gian của Pháp thay vì .toTimeString().slice(0,8)


2
Cái này hoạt động ra sao? Tôi chưa bao giờ thấy cú pháp backtick trước đây. Tôi không thể tìm thấy bất cứ điều gì trên đó sau khi tìm kiếm nhanh.
Carcigenicate

1
Làm việc cho tôi trong Inox (Chromium)
redstarcoder

1
@Carcigenicate Đó là một phần của thông số JavaScript mới nhất, ECMAScript6. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
triệt

@darrylyeo Cảm ơn. Tôi có thể tìm thấy những thứ trên cú pháp theo nghĩa đen, nhưng tôi không thể thấy nó được áp dụng ở đây như thế nào. Tôi cần phải đọc thông số kỹ thuật một lần nữa. Tôi vẫn không hiểu làm thế nào chức năng đi trước backtick được sử dụng.
Carcigenicate

2
Bạn có thể lưu 3 byte trong Firefox một với new Date().toLocaleTimeString`fr` (1 byte trong Chrome một với ...TimeString('fr'))
ETHproductions 6/12/2016

6

Python 2, 50 byte

(Python 2.1+ ctimekhông có đối số)

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

time.ctime() mang lại một chuỗi được định dạng, từ đó hh: mm: ss có thể được cắt bằng cách sử dụng [11:19] (nó vẫn ở cùng một vị trí bất kể ngày và giờ).

printđưa cỗ xe trở về '\r'trước văn bản và biến văn bản thành mục đầu tiên của một tuple với ,việc triệt tiêu hiệu quả dấu vết ngầm'\n' và ghi đè lên đầu ra được viết trước đó.

while 1 vòng lặp mãi mãi.


3
Tôi nghĩ rằng điều này cần một ,kết thúc để thay thế dòng mới nếu không trong Python 2.7.12 tôi nhận được dòng mới.
redstarcoder

Rất tiếc, có bạn đúng ... đã cập nhật
Jonathan Allan

5

Toán học, 48 41 37 28 byte

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

Đầu ra sẽ là một TimeObject, làm mới liên tục.

Trông như thế này: nhập mô tả hình ảnh ở đây

Phiên bản thay thế

48 byte:

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

53 byte:

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

1
Với việc cập nhật mỗi giây, bạn có đảm bảo rằng nó không bao giờ bỏ qua giây không? (Ví dụ: 11:11:11 -> 11:11:13)
redstarcoder

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

1
@redstarcoder nó cập nhật cứ sau ~ 1.002s, vì vậy tôi đã thay đổi thành cập nhật sau mỗi 100ms
JungHwan Min

Welp, tôi chỉ nhận ra rằng tôi không thực sự cần Pause.
JungHwan tối

Dynamic@{Now,Clock[]}[[1]]là 26 byte và hiển thị một đối tượng datetime. Dynamic@{DateString@"Time",Clock[]}[[1]]là 40 byte và chỉ xuất ra hh: mm: ss
Kelly Lowder

5

Tôi thấy rằng yêu cầu về đầu vào UI không tín hiệu để dừng chương trình đã bị xóa. Vì vậy, bây giờ chúng ta có thể làm:

Bash + coreutils, 28

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

yes liên tục xuất chuỗi "ngay bây giờ", một lần trên mỗi dòng, thành một đường ống.

date -f-đọc diễn giải mỗi "bây giờ" là thời gian hiện tại, sau đó xuất ra ở định dạng bắt buộc. Chuỗi định dạng bao gồm chuỗi thoát ANSI để xóa màn hình. date làm ra một dòng mới sau ngày - Tôi không chắc chắn nếu điều này không đủ điều kiện, vì dù sao màn hình sẽ bị xóa mỗi lần.

Nếu nó không đủ điều kiện, sau đó chúng ta có thể sử dụng tr thay thế:

Bash + coreutils, 31

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

Câu trả lời trước:

Bash + X, 32

xclock -d -update 1 -strftime %T

Thật không may, điều này chỉ có thể cập nhật mỗi giây. Nếu điều đó không đủ điều kiện, thì chúng ta có thể làm điều này thay vào đó:

Bash + coreutils, 43

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

Cập nhật mỗi giây là tốt, miễn là nó không bao giờ bỏ qua giây (IE: 12-> 14).
redstarcoder

Tôi sẽ cho phép dòng mới của bạn! Tôi không bao giờ mong đợi trường hợp này xảy ra heh.
redstarcoder

Điều này có được phép không? date +$'\e[2J'%T;$0
Evan Chen

@EvanChen không, bởi vì mỗi lần lặp đệ quy sinh ra một quy trình mới và cuối cùng sẽ sử dụng hết bộ nhớ có sẵn hoặc không gian PID, tương tự như tràn ngăn xếp. Tuy nhiên, bạn có thể làm được date +$'\e[2J'%T;exec $024 byte ...
Chấn thương kỹ thuật số

4

QBIC , 6 byte

{_C?_d

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

Liên tục xóa màn hình và in thời gian hệ thống theo định dạng 22:03:41.


3

Clojure, 150 136 141 byte

V3: 141 byte :(

+5 byte để sửa lỗi. Vì thời gian không được đệm bằng 0, đồng hồ có thể "co lại" và mở rộng khi thời gian thay đổi. Đó là "bôi nhọ" khi nó bị thu hẹp vì chữ số cuối cùng không còn bị xóa. Đã sửa nó bằng cách thêm một số khoảng trắng ở cuối để đảm bảo mọi thứ được ghi đè.

#(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 bằng cách chuyển sang sử dụng SimpleDateFormatđể định dạng ngày. Vẫn còn rất lớn.

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

Tôi nhận ra có lẽ tôi đang sử dụng cách tồi tệ nhất có thể để có được ngày. Chắc chắn phòng để cải thiện ở đây.

Ung dung:

(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

Đồng hồ Bash +, 19 byte

đồng hồ không phải là một phần của coreutils , nhưng có sẵn trên hầu hết mọi bản phân phối Linux.

Chơi gôn

watch -tn1 date +%T

Hãy thử trực tuyến!


2

WinDbg, 73 byte

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

Nó liên tục cập nhật một dòng với thời gian hiện tại cho đến khi người dùng nhấn Ctrl + Break.

Làm thế nào nó hoạt động:

.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

Đầu ra mẫu (tốt, bạn có ý tưởng):

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 byte

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

Các datechức năng in tất cả mọi thứ theo nghĩa đen mà nó doesn't nhận ra.

\r là trả về vận chuyển, đặt con trỏ đến cột đầu tiên.

Chạy với -r.


2

MATL , 11 byte

`XxZ'13XODT

Vòng lặp vô hạn giúp xóa màn hình và in thời gian theo định dạng đã chỉ định.

Bạn có thể thử nó tại MATL Online! . Trình biên dịch này là thử nghiệm; nếu nó không hoạt động, hãy làm mới trang và nhấn "Run" lần nữa.


2

C #, 82 byte

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

Phương thức ẩn danh liên tục ghi đè 8 ký tự với đầu ra mới. Có thể được thực hiện ngắn hơn 1 byte nếu sửa đổi để chấp nhận tham số giả ( z=>...).

Chương trình đầy đủ:

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
Có được phép không nhập khẩu System? Một số người làm điều đó và một số người không: /
Yytsi

Anh ấy đã không làm trong giải pháp thực tế của mình, chỉ trong chương trình demo, vì vậy, nó ổn thôi
Stefan

2

C #, 65 byte

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

Hoạt động bằng cách ghi đè cùng một dòng trong một vòng lặp vô tận


2

SmileBASIC 3.3.2, 38 byte

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

UTF-16 hút :(

Dù sao, điều này liên tục in giờ địa phương trong HH: MM: SS với một khoảng trắng sau nó, không có dòng mới nào sau đó. Mặc dù vậy, nó không cập nhật mỗi giây, nó chỉ in liên tục.


Xin lỗi điều này không hợp lệ, nó cần thay thế đầu ra, điều này không. Đặt dòng đầu tiên thành @L?TIME$và nối thêm một dòng sau (trong tổng số 3 dòng) sẽ đọc LOCATE 0, 0được mẹo (SmileBASIC có hỗ trợ vận chuyển trở lại không?).
redstarcoder

Ngoài ra, bạn đã quên ghi điểm dòng mới, làm cho 40 byte này (UTF-16 là tàn bạo đối với môn đánh gôn). Bạn có thể nhận được độ dài ký tự rất dễ dàng thông qua Python REPL len(""" YOUR CODE HERE """), sau đó chỉ cần làm * 2 cho UTF-16.
redstarcoder

Không có SB nào không thực sự làm CR, tôi sẽ phải bỏ một câu lệnh LỘC vào đó, điều đó sẽ phá hủy hoàn toàn điểm số của tôi: P Hoặc CLS: VSYNC cũng tệ như vậy.
ốc_

Vâng, đáng buồn là giải pháp này không hợp lệ mà không có nó. Tin tốt mặc dù! SmileBASIC được ghi là 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);}}

Có vẻ như (đối với tôi) bạn cũng có thể loại bỏ time.h. Điều này loại bỏ loại time_t, vì vậy bạn cần phải tạo một số nguyên thay thế. Điều này có thể được thực hiện bằng cách khai báo nó bên ngoài chính (như n;main...), loại bỏ sự cần thiết cho int. Bạn cũng có thể thoát khỏi charthủ thuật tương tự : b[9];main.... Bây giờ cả hai đều là kiểu int, nhưng nó đủ linh hoạt.
nmjcman101

Ồ, cảm ơn rất nhiều, tôi không biết điều này sẽ làm việc. Cảm ơn bạn
Stefan

Hãy dừng cho tôi nếu bạn muốn golf đó cho mình, nhưng tôi cũng lấy ra strftime...b[9]và chỉ cần thực hiện in vào này: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); Tôi không chắc chắn nếu Parens là cần thiết hay không. Ngoài ra, bạn có thể lấy ra một tập hợp {}bằng cách đặt dấu phẩy giữa các câu lệnh của mình để nófor(;;)a,b,c;
nmjcman101

1
Những dấu ngoặc đơn gây khó chịu. (n/60)%60, nghiêm túc?
anatolyg

1
Bạn có thể lưu 1 byte bằng cách khai báo nlàm tham số của main, main(n)thay vìn;main()
Karl Napf


2

Pascal, 61 byte

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

Free pascal có các thói quen thời gian đẹp trong đơn vị SysUtils. Ung dung:

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

2

C 65 (trước 64) byte

Đảm bảo hoạt động trên máy Linux. :)

@Marco Cảm ơn!

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

1

Vim, 26 byte

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

Điều này tạo ra một macro đệ quy (ví dụ: một vòng lặp vĩnh cửu) xóa tất cả văn bản trên dòng hiện tại và thay thế nó bằng thời gian hiện tại.


1

Pyth - 28 byte

Kinda longish, bởi vì pyth không có strftime

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


1

Thạch , 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

Hãy thử trực tuyến!

Việc trả lại xe ngựa không hoạt động trực tuyến và tôi không thể làm cho trình thông dịch làm việc, vì vậy nó chưa được kiểm tra, nhưng nó hoạt động như mong đợi khi tôi sử dụng các ký tự có thể in thay cho CR.


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.toTimeStringđược hỗ trợ trong việc triển khai tham chiếu của Java DateFormat.getTimeInstance(), phụ thuộc vào miền địa phương, do đó bạn có thể đặt ngôn ngữ hệ thống mặc định của mình thành một địa điểm sử dụng thời gian 24 giờ.


1

PowerShell, 30 28 24 20 byte

Đã thay đổi vùng máy tính của tôi thành Đức dựa trên nhận xét của raznagul để lưu 4 byte. :)

for(){date -F T;cls}

Phiên bản trước đó hoạt động ở tất cả các địa phương.

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


0

Mẻ, 36 byte

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

Trong đó đại diện cho ký tự BS ASCII (mã 8).


0

Vợt, 71 byte

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

Trong đó thực sự là một CR (hex 0d). Kết xuất hex của chương trình để làm rõ thêm (thông báo byte tại vị trí 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

Sử dụng SRFI / 19 đi kèm với phân phối vợt. (current-date)được ngày & giờ địa phương hiện tại. Các date->stringđịnh dạng ~3là ISO-8601 định dạng giờ phút giây. (let l () ... (l))trong một vòng lặp vô hạn thành ngữ. (require srfi/19)tải srfi/19mô-đun.


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

0

TI-Basic, 40 byte

(Trong TI-BASIC, nhiều ký tự là 2 byte và dấu hai chấm ở đầu dòng là 0 byte thêm)

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

0

R, 41 byte

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

Có một dấu cách (vì catdấu phân cách mặc định là khoảng trắng).
Do tốc độ làm mới của GUI R, việc chạy này trong GUI đôi khi sẽ bỏ qua vài giây, nhưng nếu bạn lưu nó vào một tệp và chạy nó trên dòng lệnh, nó sẽ hiển thị chính xác từng giây.
Sẽ chạy mãi cho đến khi người dùng ngắt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.