Đã đến lúc thử thách đồng hồ!


25

Tôi muốn bạn xây dựng cho tôi một chiếc đồng hồ hiển thị thời gian theo định dạng này:

18 ----------
19 --------------------------------------------------

Điều này sẽ hiển thị '18: 10 '. Giờ hiện tại và giờ tiếp theo được hiển thị ở phía trước của dòng, theo sau là khoảng trắng và một số dấu gạch ngang: trên dòng đầu tiên số phút đã trôi qua trong giờ này và dòng thứ hai hiển thị thêm bao nhiêu phút nữa để đi trong giờ này.

Làm rõ

  • Đồng hồ sẽ hiển thị thời gian của hệ thống. Nếu lấy thời gian từ một nguồn khác thuận tiện hơn, điều đó cũng tốt. Nó có thể không được cung cấp như là đầu vào.
  • Tại 18:00, dòng trên cùng chỉ là 18(Không gian lưu trữ được phép nhưng không bắt buộc)
  • Tại 18:59, điểm mấu chốt là19 -
  • Giờ <10 được đệm trước bằng dấu 0( 01 -----) hoặc căn phải ( 1 -----). Một chữ số đơn căn lề trái không được phép, ngay cả khi dấu gạch ngang bắt đầu ở vị trí bên phải ( 1 -----không hợp lệ).
  • Đồng hồ sẽ hiển thị giờ theo định dạng 24h.
  • Mặc dù nó được gọi là định dạng 24h, nhưng thực tế không có định dạng 24này. Trong giờ thứ 23, dòng thứ hai bắt đầu bằng 00hoặc 0.
  • Màn hình cần được cập nhật ít nhất một lần một phút, nhưng điều đó không phải xảy ra vào đúng 00giây. Bạn có thể cập nhật thường xuyên / liên tục hơn nếu điều đó thuận tiện hơn, nhưng tất nhiên kết quả vẫn phải rõ ràng - không phải là một vết bẩn trên màn hình.

Đầu vào

Không ai.

Đầu ra

  • Như mô tả ở trên. Không gian lưu trữ để đệm đồng hồ đến các vị trí 60-ish được cho phép trên cả hai dòng, một dòng mới cũng được cho phép.
  • Màn hình cần phải được xóa khi hiển thị vào phút tiếp theo: bằng lệnh màn hình rõ hoặc bằng cách thêm không dưới 30 dòng mới.

Quy tắc bổ sung


chúng ta có thể có hai khoảng cách giữa số và dấu gạch ngang không?
Adám

6
"Cập nhật một lần một phút" - Nó có thể được cập nhật thường xuyên hơn không?
cười

1
@smls Có, bạn có thể cập nhật bao nhiêu lần tùy thích. Tôi sẽ thay đổi thông số kỹ thuật thành 'ít nhất một lần một phút'.
steenbergh

1
@KritixiLithos Điều đó sẽ phá vỡ sự liên kết với giờ hai chữ số (9, 10 hoặc 23, 00), vì vậy không, không được phép.
steenbergh

1
Sau 23, giờ tiếp theo là 24 hay 0?
Kritixi Lithos

Câu trả lời:


2

MATL , 41 byte

Cảm ơn @Kundor vì đã nhận thấy một lỗi, giờ đã sửa

`XxFT"4&Z'@+24\OH&YAO'-'60@*5&Z'-|Y"hhD]T

Hãy thử nó tại MATL trực tuyến!Nhưng lưu ý rằng chương trình bị tắt sau 30 giây, vì vậy rất khó để nắm bắt bất kỳ thay đổi nào trong đầu ra.

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

`           % Do...while
  Xx        %   Clear screen
  FT        %   Push [0 1]
  "         %   For each k in [0 1]
    4&Z'    %     Push current hour
    @+      %     Add k
    24\     %     Modulo 24. This transforms 24 into 0
    OH&YA   %     Convert to base-10 string with 2 digits
    O       %     Push 0. Concatenating with chars will convert this to char,
            %     and char(0) will be displayed as a space
    '-'     %     Push '-'
    60@*    %     Push 60*k
    5&Z'    %     Push current minute
    -|      %     Absolute difference. This gives current minute for k==0,
            %     or 60 minus that for k==1
    Y"      %     Repeat '-' that many times
    hh      %     Concatenate the top three elements into a string
    D      %      Display
  ]         %   End
  T         %   Push true
            % End (implicit). Since the top of the stack contains true, this
            % gives an infinite loop

Có thể là tôi, nhưng ở lần lặp thứ hai, chỉ có dòng trên cùng được in ...
steenbergh

@steenbergh Nó hoạt động với tôi với phút và giây thay vì giờ và phút, vì vậy những thay đổi dễ dàng được nhìn thấy: matl.suever.net/ Kẻ
Luis Mendo

1
Đúng, làm việc. - trên thực tế, có thể rất tuyệt khi có điều này như dòng 3 và 4 của đồng hồ của riêng tôi.
steenbergh

@steenbergh: bạn đã chấp nhận câu trả lời này, nhưng nó không hợp lệ. Nó hiển thị giờ sau 23 là 24. Tôi tin rằng câu trả lời đúng ngắn nhất là câu trả lời của Ruby theo Value Ink.
Nick Matteo

@kundor Cảm ơn bạn đã chú ý. Được sửa với giá 3 byte
Luis Mendo

11

TI-Basic, 94 byte

" 
Repeat 99<length(Ans
Ans+"-
End
Ans→Str1
Repeat 0
getTime
ClrDraw
Ans{Ans(1)≠24,1,1
Text(0,0,Ans(1),sub(Str1,1,1+Ans(2
Text(6,0,Ans(1)+1,sub(Str1,1,61-Ans(2
End

Tương đối đơn giản. Đó là một chuỗi có một khoảng trống ở đầu. Các giờ được căn phải. Điều này chỉ hoạt động trên máy tính TI-84 + vì TI-83 không có đồng hồ bên trong.

Chỉnh sửa: Cảm ơn @kundor vì đã nhận thấy rằng tôi đã không đóng vòng lặp cuối cùng. Đã sửa bây giờ (+2 byte).

Chỉnh sửa # 2: Giờ đầu tiên phải bằng 0, không phải hai mươi bốn. Sửa chữa với chi phí +14 byte.


Mỗi lệnh được tính là một byte?
Sygmei

@Sygmei Hầu hết các mã thông báo là một byte, vâng. Tuy nhiên, mã thông báo như Str1, getTimesub(hai byte mỗi. Bạn có thể tìm hiểu thêm tại tibasicdev.wikidot.com/tokens
Timtech

Bạn sẽ không có một liên kết đến một trình giả lập, phải không?
steenbergh

Tôi muốn giới thiệu cemetech.net/projects/jstified nhưng hãy nhớ rằng việc sử dụng ROM từ internet với trình giả lập này trừ khi bạn sở hữu loại máy tính đó.
TimTech

1
Đừng sợ nhấp vào liên kết, vì trình giả lập là hợp pháp và yêu cầu bạn tải lên ROM của riêng mình trước khi nó hoạt động. TI đã từng có sẵn chúng miễn phí nhưng chúng không còn nữa. Nếu bạn có thể tìm thấy TI-84 từ một người bạn, đó sẽ là lựa chọn tốt nhất.
TimTech

9

Mẻ, 197 byte

@echo off
set/ah=100+%time:~0,2%,m=1%time:~3,2%
cls
call:l
set/ah=(h-3)%%24+100,m=260-m
call:l
timeout/t>nul 60
%0
:l
set s=%h:~1% 
for /l %%i in (101,1,%m%)do call set s=%%s%%-
echo %s%

Lưu ý: dòng thứ 10 có dấu cách. Đối với tôi, %time%định dạng giờ với không gian hàng đầu nhưng phút với số 0 đứng đầu. Tôi quyết định số 0 đứng đầu là một định dạng đầu ra dễ dàng hơn, vì tất cả những gì tôi phải làm là thêm 100 giờ và xóa chữ số đầu tiên. Phút là khó khăn hơn 08hoặc 09sẽ gây ra lỗi phân tích bát phân, vì vậy tôi thêm tiền tố một 1cách hiệu quả thêm 100 phút, điều chỉnh cho điều này bằng cách bù đắp vòng lặp một cách thích hợp, ngắn hơn một byte so với trừ 100.


7

Python 3.6, 110 114 112 byte

from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*50+'%2d '%h+'-'*m+f'\n{-~h%24:2} '+'-'*(60-m))

Điều này sử dụng định dạng chuỗi f mới để lưu một byte ( f'\n{h+1:2} 'so với '\n%2d '%(h+1)) Bạn có thể thay đổi [sleep(9)]thành1 để lưu 8 byte, nhưng sau đó nó chỉ spam màn hình.

Đã lưu một byte thay đổi while 1:...;sleep 60thànhwhile[sleep(60)]:... , nhờ TuukkaX.

Tôi đã phải sử dụng thêm 5 byte để có được giờ tiếp theo được hiển thị sau 23 thành 0, thay vì 24, như OP vừa nhận xét. :-(

Đã phục hồi một byte bằng cách chỉ ngủ 9 giây thay vì 60.

Đã lưu hai byte bằng cách sử dụng một chút để rút ngắn (h+1)%24, mượn từ câu trả lời Ruby của Value Ink .


Bạn có thể giải thích lý do tại sao bạn đặt dấu ngoặc vuông xung quanh điều kiện if không? Sẽ không có không gian giữa lúc và ngủ là 1 byte, trái ngược với 2 ở hai bên? EDIT: Đừng bận tâm, đó là để làm cho nó trung thực. Đủ công bằng.
Bóng tối

1
@shadow: sleeptrả về None, đó là giả.
Nick Matteo

@ ToivoSäwén: sleepcũng nằm trongtime mô-đun, vì vậy nhập * là tốt hơn.
Nick Matteo

5

Ruby, 98 95 91 byte

Cập nhật cứ sau 5 giây. Chỉ hoạt động trong các thiết bị đầu cuối kiểu Unix.

loop{t=Time.now;puts`clear`+"%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}

Phiên bản nhắc lệnh của Windows, 95 92 byte:

loop{t=Time.now;puts"\e[H\e[2J%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}

Bạn có thể sử dụng backticks thay vì hệ thống? `cls`vssystem'cls'
IMP1

Có vẻ như không, nhưng bạn có thể sử dụng h=t.hourvà sau đó sử dụng hthay vì thứ hai t.hour, giúp tiết kiệm 3 byte.
IMP1

@ IMP1 thực sự, backticks không hoạt động cls. Cảm ơn cho đề nghị khác của bạn, mặc dù!
Mực giá trị

@ IMP1, hóa ra puts`clear`là cách tốt nhất nếu bạn sử dụng các thiết bị đầu cuối Unix. Nó chỉ không hoạt động với dấu nhắc lệnh Windows cls.
Mực giá trị

Đối với các cửa sổ, bạn có thể puts"\e[H\e[2J"xóa bảng điều khiển, mà tôi nghĩ sẽ cạo bốn byte. Nó sẽ làm cho dòng đầu tiên của bạn được đọcloop{t=Time.now;puts"\e[H\e[2J%02d %s
IMP1

4

Perl 6 , 113 byte

loop {$_=DateTime.now;.put for |('' xx 30),|([\+](.hour,1)».fmt('%2s')Z('-' Xx[\-](.minute,60)».abs));sleep 60}

Hãy thử một lần với thời gian chờ một giây.

Hoặc thử một phiên bản thay đổi dẫn đến kết quả chạy trong vài giờ.

Mở rộng:

loop {                  # keep repeating forever

  $_ = DateTime.now;    # assign an object representing the current time

    .put                # print with trailing newline
                        # ( adds a space between numbers and dashes )

  for                   # for each of the following

    |(                  # make it a slip so that it is all part of one list

      '' xx 30          # 30 empty strings (30 empty lines)
    ),

    |(

        [\+](           # triangle produce
          .hour,        # the hour
          1             # the hour plus one

        )».fmt( '%2s' ) # both formatted to two element string ( space padded )

      Z                 # zipped with

        (
            '-'         # a dash

          Xx            # cross (X) using string repeat (x) operator

            [\-](       # triangle produce
              .minute,  # the minute
              60        # the minute minus 60

            )».abs      # absolute value of both
        )
    );

  sleep 60              # wait until the next minute
}

Những toán tử nào hỗ trợ 'tam giác sản xuất'? Trong [\+]đó thêm và trong [\-]nó dường như trừ đi. Liệu điều này làm việc với phép nhân và như vậy?
Yytsi

@TuukkaX Nó nên hoạt động với hầu hết các toán tử infix. Về cơ bản, nó giống như [+] LISTlà giảm, ngoại trừ nó cung cấp cho bạn các giá trị trung gian. Xem trang tài liệu để sản xuất
Brad Gilbert b2gills

4

QBasic, 120 127 121 byte

Đừng chạy cái này quá lâu nếu không laptop của bạn sẽ bốc cháy. Bây giờ 99.several9s% ​​CPU hiệu quả hơn.

CLS
m=TIMER\60
h=m\60
m=m MOD 60
FOR i=1TO 2
?USING"## ";h MOD 24;
FOR j=1TO m
?"-";
NEXT
?
h=h+1
m=60-m
NEXT
SLEEP 1
RUN

Ung dung và giải thích

DO
    CLS
    totalMinutes = TIMER \ 60
    hour = totalMinutes \ 60
    minute = totalMinutes MOD 60

    FOR row = 1 TO 2
        PRINT USING "## "; hour MOD 24;
        FOR j = 1 TO minute
            PRINT "-";
        NEXT j
        PRINT

        hour = hour + 1
        minute = 60 - minute
    NEXT row

    SLEEP 1
LOOP

Chúng tôi bắt đầu bằng cách xóa màn hình, sau đó lấy số giờ và phút hiện tại, từ TIMERđó trả về số giây kể từ nửa đêm.

Đây là lần đầu tiên tôi thử PRINT USING, vì vậy tôi rất vui mừng khi phát hiện ra rằng nó không phải chịu sự châm biếm QBasic thông thường rằng các số dương được in với một khoảng trắng hàng đầu.##như bộ xác định định dạng đảm bảo rằng các số có một chữ số được căn phải và được đệm bằng một khoảng trắng, theo yêu cầu. Thật không may, chúng ta phải sử dụng một vòng lặp cho các dấu gạch nối, thật không may, vì QBasic không có chức năng lặp lại chuỗi. (Nếu tôi nhầm, xin vui lòng cho tôi biết!)

Tất cả các PRINTtuyên bố kết thúc với ;để ngăn chặn dòng mới; nhưng sau những dấu gạch nối, chúng ta cần một dòng mới; do đó, sự đơn độc ?sau FORvòng lặp bên trong .

Các SLEEP 1hiện nay là cần thiết. Không có nó, màn hình sẽ bị xóa rất nhanh sau khi in, nó chỉ là một mớ hỗn độn nhấp nháy. (Tôi đã sử dụng LOCATE 1thay vì CLSlúc đầu vì lý do đó, cho đến khi tôi nhận ra rằng CLSvới SLEEPngắn anyway.) RUNKhởi động lại chương trình từ đầu - con đường ngắn nhất để có được một vòng lặp vô hạn.


Làm thế nào để điều này xử lý giờ cuối cùng trong ngày? Dòng trên cùng đọc 23, nhưng giờ trên dòng dưới cùng là gì?
steenbergh

Tôi đang sử dụng Note7 và nghĩ đến việc chạy chương trình này trong tương lai gần thay cho đồng hồ trên thanh trạng thái của tôi. Đó có phải là một ý tưởng tốt?

@steenbergh Rất tiếc, đã sửa. Nó sẽ hữu ích cho bạn để đề cập đến trường hợp cạnh trong câu hỏi.
DLosc

@DLosc Nah, tôi chỉ nói đùa thôi :)). Nhưng vâng, thông minh !!
Owlswipe

1
@steenbergh Anh ấy in h MOD 24, nếu ban đầu h = 23 thì vòng lặp tiếp theo sẽ chuyển thành 24 và được sửa đổi thành 0. Nhưng tôi tò mò liệu nó có hoạt động tốt không. CLS xóa dòng đầu tiên để không bao giờ có cả hai dòng in trên màn hình, phải không?
Jens

4

Java 8, 313 300 299 byte

import java.time.*;()->{for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>30){c=0;String l="",u,d;for(i=0;i++<60;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}

Điều này chỉ cập nhật cứ sau 30 lần lặp của vòng lặp while. 29 lần lặp khác chỉ in các dòng mới.

Đã cập nhật

Đã lưu 13 14 byte nhờ sự giúp đỡ của Kevin Cruijssen! Cảm ơn!


Xin chào, chào mừng đến với PPCG! Trước hết, chỉ cho phép các chương trình / chức năng và mã hiện tại của bạn là một đoạn mã. Bạn sẽ phải bao quanh nó bằng một phương thức (nghĩa là void f(){...}và cần thêm nhập khẩu mà nó yêu cầu (trong trường hợp của bạn import java.time.*;). Điều đó có nghĩa là, mã của bạn có thể được đánh golf ở nhiều nơi để hạ thấp nó xuống còn 311 byte (ngay cả với phương thức đã thêm -declaration và nhập khẩu). (Vì quá dài cho nhận xét này, tôi đã đặt nó trong bình luận tiếp theo .. xD)
Kevin Cruijssen

import java.time.*;void f(){for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>99){c=0;String l="",u,d;for(i=0;i++<61;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}( 303 byte ) Tôi khuyên bạn nên đọc Mẹo chơi gôn trong JavaMẹo để chơi gôn bằng <tất cả các ngôn ngữ> . Tận hưởng kì nghỉ của bạn.
Kevin Cruijssen

@KevinCruijssen Tôi đã cập nhật câu trả lời của mình và có thể lưu thêm 3 byte bằng cách sử dụng ký hiệu lambda. Ngoài ra, tôi cũng đã thay đổi một vài mã thành mã bạn cung cấp để đáp ứng các thông số kỹ thuật (ví dụ for(i=0;i++<60thay vì 61 và (h<10?thay vì 9. Cảm ơn đã thông báo cho tôi về khai báo phương pháp và một số mẹo chơi gôn!
CraigR8806

Ah, 61 thay vì 60 thực sự là sai lầm của tôi. Tôi nghĩ rằng tôi đã viết nó for(i=0;++i<61thay vì for(i=0;i++<61(trong trường hợp thứ hai này thực sự là 60, và mặc dù nó có cùng số byte, nhưng nó có thể rõ ràng hơn / dễ đọc hơn). Mã h<9trong tôi là chính xác, mặc dù. Bạn đã có h+1<10trước đây và tôi chỉ đơn giản thay đổi điều này h<9bằng cách loại bỏ 1 ở cả hai bên. :)
Kevin Cruijssen

1
@KevinCruijssen Ha Tôi đã không nhận ra điều đó! h<9. Tôi sẽ chỉnh sửa nó để tiết kiệm thêm 1 byte. Cảm ơn một lần nữa!
CraigR8806

4

C, 176 162 161 160 156 byte

Đây là một lạm dụng thô của con trỏ nhưng biên dịch và chạy theo quy định. Hãy chắc chắn biên dịch mà không tối ưu hóa nếu không bạn có khả năng gặp phải một segfault.

main(){int*localtime(),b[9],*t;memset(b,45,60);for(;;)time(&t),t=localtime(&t),usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));}

Ung dung:

#import<time.h>
main()
{
 int *t,b[60];
 memset(b,45,60);
 for(;;) {
  time(&t);
  t=localtime(&t);
  usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));
 }
}

3

JavaScript (ES6), 162 byte

Cập nhật mỗi giây một lần

setInterval(c=>{c.clear(d=new Date,m=d.getMinutes(),h=d.getHours(),H=_=>`0${h++}`.slice(-2)),c.log(H()+` ${'-'.repeat(m)}
${H()} `+'-'.repeat(60-m))},1e3,console)


Bạn có thể lưu khá nhiều byte bằng cách cấu trúc lại mã để chỉ có một câu lệnh (có thể gọi console.clear()bên trong console.logđối số) và gán trong ngoặc đơn không sử dụng càng nhiều càng tốt. Phiên bản cho 154B : setInterval(c=>c.log(H(h,c.clear(d=new Date))+` ${'-'.repeat(m)} ${H(h+1)} `+'-'.repeat(60-m)),1e3,console,m=d.getMinutes(h=d.getHours(H=$=>$<9?'0'+$:$))).
Lu-ca

Bạn có thể lưu một bó byte bằng cách đặt giờ và phút vào một hàm m=>`0${h++} \.slice(-3)+'-'.repeat(m).
Neil

3

Python 2, 131 129 127 byte

from time import*
while[sleep(9)]:exec(strftime("a='%H';b=int('%M')"));print "\n"*30+a+" "+"-"*b+"\n"+`int(a)+1`+" "+"-"*(60-b)

đã lưu một byte nhờ @TuukkaX


2
Bạn không cần dòng mới và không gian sauwhile 1:
Wheat Wizard

Tôi bắt đầu mã của bạn @ 19: 55. Lúc 20:01, tôi thấy 19 - \n 20 -----------------------------------------------------------. Giờ không cập nhật ...
steenbergh

@steenbergh Tôi đã thử nó bằng cách đặt đồng hồ bằng tay và nó hoạt động với tôi.
trứng

@ovs không thử thách đồng hồ vui vẻ :-). Dù sao, có lẽ là một cái gì đó với repl.it sau đó ...
steenbergh

head- Desk Máy chủ Altern.it chậm hơn một giờ so với giờ địa phương của tôi ... Và nó thậm chí còn nói như vậy ở ngay đầu bảng điều khiển. Tôi sẽ thấy mình ra ngoài, cảm ơn ...
steenbergh

3

C 251 267 251 byte

 #include<time.h>f(){time_t t;struct tm *t1;h,m,i;while(1){time(&t);t1=localtime(&t);h=t1->tm_hour;m=t1->tm_min;printf("%d ",h);for(i=1;i<=m;i++)printf("-");puts("");printf("%d ",h+1);for(i=0;i<=59-m;i++)printf("-");puts("");sleep(1);system("clear");}}

Phiên bản ung dung

#include<time.h>
void f()
{
 time_t t;
 struct tm *t1;
 int h,m,i;

 while(1)
 {
  time(&t);     
  t1=localtime(&t);
  h=t1->tm_hour;
  m=t1->tm_min;

  printf("%d ",h);
  for(i=1;i<=m;i++)
   printf("-");

  puts("");
  printf("%d ",h+1);

  for(i=0;i<=59-m;i++)
   printf("-");

  puts("");    

  sleep(1);
  system("clear");    
 }
}

Hoàn thành công việc! Chắc chắn có thể được rút ngắn theo một cách nào đó. Giả sử unistd.htập tin được bao gồm.

@Neil Cảm ơn thông tin.

@Seth Cảm ơn, vì đã tiết kiệm 8 byte.


IIRC bạn phải bao gồm mọi thứ cần thiết để có được mã để biên dịch (trong trường hợp này là các định nghĩa time_tstruct tm) trong số byte của bạn.
Neil

Thay vì printf("\n");bạn có thể sử dụngputs("");
Seth

3

Lần đầu chơi gôn ...

Powershell, 116 byte (là 122)

while($d=date){$f="{0:D2}";$h=$d.Hour;$m=$d.Minute;cls;"$($f-f$h)$("-"*$m)`n$($f-f(++$h%24))$("-"*(60-$m))";Sleep 9}

Chỉnh sửa: Từ lời khuyên của @ admBorkBork, đã thay đổi Ngày cập nhật và Xóa thành cls, để tiết kiệm 6 byte.


Chào mừng bạn đến với PPCG, câu trả lời hay
george

Chào mừng đến với PPCG! Một vài môn đánh gôn dễ dàng - bạn có thể sử dụng clsthay vì clearvà (miễn là bạn đang ở trên Windows) datethay vì get-date. Tôi cũng chắc chắn có một số cách dễ dàng hơn để xuất định dạng - Tôi đang chơi với nó và tôi sẽ cho bạn biết nếu tôi nghĩ ra bất cứ điều gì.
admBorkBork

Tốt đẹp. Hãy thử điều này: 108 byte while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}. Thay vào đó, hãy sử dụng ngắt dòng trong trình soạn thảo của bạn ``
n`

3

PHP, 104 105 byte

<? for(;;sleep(6))printf("%'
99s%2d %'-".($m=date(i))."s
%2d %'-".(60-$m).s,"",$h=date(H),"",++$h%24,"");

giới thiệu cho printfnhân vật tùy chỉnh đệm của:
"%'-Ns"= chuỗi pad trái với -tới Nký tự.

sẽ in 99 dòng mới (cứ sau 6 giây) thay vì xóa màn hình.

Dòng mới đầu tiên phải là một ký tự duy nhất. Vì vậy, trên Windows, nó phải được thay thế bằng \n.


2

Ngôn ngữ GameMaker, 134 byte

s=" "while 1{s+="-"a=current_hour b=current_minute draw_text(0,0,string(a)+string_copy(s,1,b+1)+"#"+string(a+1)+string_copy(s,0,61-b)}

Trong cài đặt, bạn phải bỏ qua các lỗi không nghiêm trọng để làm việc này. Ngoài ra, trong GML, #tương đương với \nhầu hết các ngôn ngữ.


2

Perl 6 , 104 byte

DateTime.now.&{"\ec{.hour.fmt: '%2s'} {'-'x.minute}\n{(.hour+1).fmt: '%2s'} {'-'x 60-.minute}"}.say xx*

Cần phải được chạy trên thiết bị đầu cuối tương thích ANSI để trình tự điều khiển để đặt lại thiết bị đầu cuối hoạt động.

Khá cơ bản (vì các cách tiếp cận khó hiểu hơn tôi đã thử bật ra lâu hơn):

  • DateTime.now.&{" "}.say xx*: Chuyển đổi thời gian hiện tại thành một chuỗi (xem bên dưới) và nói nó, và lặp lại tất cả số đó vô số lần. Chuỗi được xây dựng như thế này:
    • \ec: Mã điều khiển ANSI <ESC>cđể đặt lại thiết bị đầu cuối, giúp xóa màn hình.
    • {.hour.fmt: '%2s'}: giờ, căn phải sang 2 cột
    • : không gian
    • {'-'x.minute}: dấu gạch ngang lặp đi lặp lại trong phút
    • \n: dòng mới
    • {(.hour+1).fmt: '%2s'}: giờ tiếp theo, căn phải sang 2 cột
    • : không gian
    • {'-'x 60-.minute}: gạch ngang lặp đi lặp lại 60 lần trừ phút

2

AWK, 190 byte

#!/bin/awk -f
func p(x,y,c){printf("%2s ",x)
for(j=0;j<y;j++)printf(c)
print}BEGIN{for(;;){split(strftime("%H %M"),t)
m=t[2]
if(o!=m){p(a,30,"\n")
p(t[1],m,"-")
p((t[1]+1)%24,60-m,"-")}o=m}}

AWKkhông có sleepchức năng tích hợp sẵn, tôi chỉ cần liên tục kiểm tra đồng hồ để xem phút đã thay đổi chưa. Điều quan trọng là nó hoạt động ... phải không? :)


2

Python 3.5, 127 120 117 byte

from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*88,*['%2d '%x+'-'*y+'\n'for x,y in[(h,m),(h+1,60-m)]])

1
Bạn có thể không chỉ print('\n'*50)thay os.system('cls')vì nó hoạt động trên cả * nix và Windows không? Sẽ tiết kiệm được một vài byte khi bạn có thể mất việc osnhập và OP nói rằng điều này được cho phép.
ElPedro

Ồ, tôi đã không đọc nó đúng cách rồi. Cám ơn nhiều, ông bạn.
Gurupad Mamadapur

Chỉ để biết thông tin, hầu hết mọi người có xu hướng sử dụng <s> </ s> xung quanh số byte cũ của họ và sau đó đặt số byte mới sau đó bởi vì thật thú vị khi thấy tiến trình khi một câu trả lời được cải thiện :-) Phải thử 3,5 thời gian. Tôi vẫn đang làm việc với Python 2.
ElPedro

1
@ElPedro Yea tôi quên làm điều đó. Tôi sẽ chỉnh sửa ngay bây giờ.
Gurupad Mamadapur

2

Python, 115 113 byte

đã lưu một vài byte nhờ @kundor và @Phlarx

import time
while 1:h,m=time.localtime()[3:5];print("\x1b[0;H{:02} {}\n{:02} {} ".format(h,"-"*m,h+1,"-"*(60-m)))

Ít nhất là trên hệ thống của tôi, điều này không xóa các ký tự bên dưới, do đó số lượng dấu gạch ngang trên dòng thứ hai sẽ không giảm khi thời gian trôi qua. Ngoài ra: bạn có thể lưu ba byte bằng cách đặt vòng lặp while của bạn trên một dòng và hai byte bằng cách thay đổi :02định dạng thành chỉ :2.
Nick Matteo

2
Bạn có thể khắc phục sự cố được mô tả bởi @kundor trong 1 byte bằng cách thêm khoảng trắng sau {} tương ứng.
Phlarx

@kundor đã sửa! Cảm ơn. Tôi giữ :02định dạng ở bên phải một chữ số giờ với số không.
dfer Nam

@kundor * pad bên trái một chữ số với số không.
dfer Nam

@dfernan: Chà, :2miếng đệm bên trái có khoảng trắng, mà thách thức nói là OK.
Nick Matteo

2

Tương tác C # (138 byte)

while(true){var d=DateTime.Now;Console.WriteLine($"{d.Hour:00} {new string('-',d.Minute)}\n{d.Hour+1:00} {new string('-',60-d.Minute)}");}

1
Bạn có thể đánh golf này xuống bằng 1) đặt tên var dthay vì dtkhông? và 2) sử dụng sleep(1e3)hay 999thay vì 1000?
steenbergh

@steenbergh xem cập nhật
series0ne

Một vài điều ... Đây chỉ là một đoạn mã không phải là một phương thức hoặc chương trình (không chắc là nó có hợp lệ trong C # Interactive hay không), về cơ bản nó là một phiên bản được đánh gôn của mã của tôi và nếu nó được nhận xét là những cải tiến không phải là một giải pháp riêng biệt (mặc dù đây là suy đoán) và có rất nhiều cải tiến nhỏ bạn có thể thực hiện ở đây, và bạn thậm chí có cần ngủ không?
TheLethalCoder

@TheLethalCoder Tôi đặc biệt đặt C # Interactive vì điều này chỉ hoạt động trong bảng điều khiển tương tác. Điều này sẽ không hoạt động như một chương trình C # tiêu chuẩn.

Also note that this won't work when the hour is 23 and when the minute is 0
TheLethalCoder

2

PHP, 112 120 bytes

for(;;sleep(9))echo($s=str_pad)($h=date(H),99,"\n",0).$s(" ",1+$m=date(i),"-")."\n".$s(++$h%24,2,0,0).$s(" ",61-$m,"-");

As there's no way to clear the screen (that I can find) I had to go with a pile of newlines. Also the question being updated to "at least" once a minute saves a byte with 9 instead of 60.

edit: @Titus noticed a bug in the padding of the second hour. Fixing it cost 8 bytes.


This displays warning text on stdout along with the correct output: Notice: Use of undefined constant str_pad - assumed 'str_pad' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant H - assumed 'H' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant i - assumed 'i' in C:\wamp64\www\my-site\a.php on line 2. Anything on Meta about that?
steenbergh

@steenbergh Thông báo đó; nó sẽ không được hiển thị nếu bạn sử dụng các giá trị mặc định (tham số dòng lệnh -nhoặcerror_reporting(22519);
Tít

giờ phải được đệm đến chiều dài 2
Tít

Điểm hay, Hcài đặt cho ngày đi từ 00-23, nhưng tôi đã quên nó trong giờ thứ hai.
dùng59178

Lưu hai byte với ngắt dòng vật lý.
Tít

2

Bash (3 và 4): 90 byte

d=(`sed s/./-/g<$0`);let `date +h=%H,m=%M`;echo $h ${d:0:m}'
'$[++h%24] ${d:m}
sleep 5
$0

Do việc sử dụng $0, this script must be put into a file, not pasted into an interactive bash shell.

Lệnh đầu tiên đặt $dthành 60 dấu gạch nối; nó dựa vào thực tế là dòng đầu tiên của kịch bản này dài 60 ký tự. Đây là ba ký tự ngắn hơn điều tốt nhất tiếp theo tôi có thể nghĩ ra:

d=`printf %060d|tr 0 -`

Nếu cuối cùng bạn không muốn điều này chạy hết hộp hoặc bộ nhớ, bạn có thể thêm evalvào đầu dòng cuối cùng, điều này sẽ tạo ra 95 byte này.


Cho tôi lỗi let: h=09: value too great for base (error token is "09"). Vấn đề là các số 0 đứng đầu được hiểu là hằng số bát phân, vì vậy 09 không hợp lệ.
Nick Matteo

Hrm, điều đó có nghĩa là kịch bản của tôi bị hỏng theo nhiều cách. Cảm ơn.
Evan Krall

2

BASH, 165 141 155 byte

while :
do
clear
m=`date +%-M`
a=`printf %${m}s`
b=`printf %$((60-m))s`
h=`date +%H`
echo $h ${a// /-}
printf "%02d %s" $((10#$h+1)) ${b// /-}
sleep 9
done

1
Tôi có thể lưu thêm 8 byte để loại bỏ giấc ngủ, nhưng tôi không thoải mái với một vòng lặp không xác định trong khi máy tính chạy mà không ngủ ;-)
pLumo

Một số tối ưu hóa: di chuyển sleep 9đến điều kiện của vòng lặp while; xóa -phía trước chữ M trong chuỗi định dạng trên dòng 4. Bạn cũng không cần sử dụng $ trước tên biến trong biểu thức số học, vì vậy $((60-$m))có thể$((60-m))
Evan Krall

Tôi không chắc liệu toán học của bạn trên dòng 9 có chính xác hay không: h=23; echo $((10#$h+1))in 24 cho tôi.
Evan Krall

Có chuyện gì với 24 vậy?
pLumo

Tôi cần -M vì $ ((60-08)) báo lỗi.
pLumo

1

Gura , 138 byte

k(a,b)={if(a<10){a="0"+a;}println(a," ","-"*b)};repeat{t=datetime.now();k(t.hour,t.min);k(t.hour+1,60-t.min);os.sleep(60);print("\n"*30);}

Pretty short and straightforward :)


Wow ... That's fast. Any tips on running Gura? Just downloaded the binaries, but running Gura.exe and pasting in this code gives me a syntax error symbol k is not defined.
steenbergh

Forgot a semicolon ! You can try to run it again :)
Sygmei

1
Does this update every minute? The console seems to run this code just once...
steenbergh

Woops, did not saw that part, should be working now !
Sygmei

When it updates, it should either clear the screen or add 30 newlines. Man, I'm on your case...
steenbergh

1

Ok, haven't done a code golf in a while, so here goes my sad attempt :)

Unix Korn Shell: 177 171 170 bytes

while :
do
clear
h=`date +%H`
m=`date +%M`
d=-----
d=$d$d$d$d
d=$d$d$d
a=`echo $d|cut -b-$m`
let m=60-$m
b=`echo $d|cut -b-$m`
let i=h+1
echo "$h $a\n$i $b"
sleep 9
done

spliced the 2 echos into 1, saved a few bytes ... (sleep 9 instead of sleep 10 saves 1 byte :P ) lol
Ditto

1

Mathematica, 235 bytes

d=UpdateInterval;e=Dynamic;f=Refresh;g=AbsoluteTime;Grid[Partition[Riffle[e[f[Floor@Mod[g[]/3600+#,24],d->1]]&/@{0,1},With[{t=#},e[f[""<>Array["-"&,If[t==60,60-#,#]]&@Setting@Floor@Mod[g[]/60+#,60],d->1]]]&/@{0,60}],2],Alignment->Left]

1

Processing, 204 200 198 197 bytes

5 bytes saved thanks to @L. Serné by using smarter ternaries

void draw(){int i;String s=((i=hour())>9?i:" "+i)+" ";for(i=0;i<minute();i++)s+="-";s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";for(i=0;i<60-minute();i++)s+="-";print(s);for(;i++<99;)println();}

This outputs 30+ newlines for each update (which takes place when the frame gets updated)

Ungolfed

void draw(){
  int i;
  String s=((i=hour())>9?i:" "+i)+" ";
  for(i=0;i<minute();i++)
    s+="-";
  s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";
  for(i=0;i<60-minute();i++)
    s+="-";print(s);
  for(;i++<99;)
    println();
}

Changing ((i=hour())<10?" ":"")+i into ((i=hour())>9?i:" "+i) would save 2B twice... Good luck with further golfing!
Luke

@L.Serne thanks for the tip :)
Kritixi Lithos

Another improvement that might work: ((i=hour()+1)>24?i=0:i)>9 becomes (i=hour()+1)>9, since hour outputs a number in the range 0-23, and even with 1 added to that, it'll never be greater than 24. Also, you should move the increment of i inside the condition in the for loop like you did in the very last loop. Should save 13B in total.
Luke

@L.Serné For the first point, I still have to include the ternary because 23+1 in a 24-hour clock becomes 0 (or at least I think). Next, if I move the increment of i inside the condition of the for-loop, i will start as 1 instead of 0 and I need to add one more byte i++<=minute() and the bytecount will still be the same. But nonetheless, thanks for helping me golf 1 more bytes :)
Kritixi Lithos

1

C, 239 bytes

#include<time.h>
#include<unistd.h>
#define F printf(
void d(n,p){for(;n--;F"%c",p));}int main(){time_t*t;for(;;){d(30,10);time(t);int*m=localtime(t);F"%2d ",m[2]);d(m[1],45);F"\n%2d ",(m[2]+1)%24);d(60-m[1],45);F"\n");sleep(1);}return 0;}

Inspired by Seth's and Abel's entries, this will output 0 instead of 24 for the next hour, as required, and will use 30 lines to clear the screen.


1

SmileBASIC, 55 bytes

TMREAD OUT H,M,
CLS?H,"-"*M?(H+1)MOD 24,"-"*(60-M)EXEC.

Explanation:

TMREAD OUT HOUR,MINUTE,
CLS
PRINT HOUR,"-"*MINUTE
PRINT (HOUR+1) MOD 24,"-"*(60-MINUTE)
EXEC 0 'runs the code stored in slot 0 (the default)

Note: SmileBASIC only has 50 columns of text, so it won't look good...


1

C# 181 176

for(;;){Console.Clear();var t=DateTime.Now;var h=t.Hour;var m=t.Minute;Console.Write("{0,2} {1}\n{2,2} {3}",h,"".PadLeft(m,'-'),++h%24,"".PadLeft(60-m,'-'));Thread.Sleep(100);}

This code assumes that the using System.Threading; line is included.

Full class:

class Program
{
    static void Main(string[] args)
    {
        Console.Title = string.Format("Started the app at: {0}", DateTime.Now.TimeOfDay);
        //new Timer((o) => { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); }, null, 0, 60000);

        for (; ; ) { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); Thread.Sleep(100); }

        Console.ReadKey(true);
    }
}

This solution has no way of exiting the loop (the original, commented, runs the code on a separate thread), so the Console.ReadKey statement is redundant. The only way to exit is to either close the console window or Ctrl+Break...
nurchi

This is only a code snippet not a method or program, also the using System.Threading; needs to be included in the byte count if you are using it. Same with Using System;.
TheLethalCoder
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.