Sudah waktunya untuk tantangan jam!


25

Saya ingin Anda membuatkan saya jam yang menampilkan waktu dalam format ini:

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

Ini menampilkan '18: 10 '. Jam saat ini dan jam berikutnya ditampilkan di bagian depan garis, diikuti oleh spasi dan sejumlah tanda hubung: pada baris pertama jumlah menit yang telah berlalu dalam jam ini, dan baris kedua menunjukkan berapa menit lagi untuk pergi dalam jam ini.

Untuk memperjelas

  • Jam harus menampilkan waktu sistem. Jika mengambil waktu dari sumber lain lebih mudah, itu bagus juga. Itu mungkin tidak diberikan sebagai input.
  • Di 18:00, baris teratas adalah adil 18(Ruang tambahan diizinkan tetapi tidak diperlukan)
  • Di 18:59, intinya adalah19 -
  • Jam <10 sudah diisi dengan 0( 01 -----) atau rata ( 1 -----). Digit tunggal rata kiri tidak diperbolehkan, bahkan jika tanda hubung dimulai di tempat yang tepat ( 1 -----tidak valid).
  • Jam harus menampilkan jam dalam format 24 jam.
  • Meskipun disebut format 24jam, sebenarnya tidak ada format 24di atasnya. Selama jam ke-23, baris kedua dimulai dengan 00atau 0.
  • Layar perlu diperbarui setidaknya sekali dalam satu menit, tetapi itu tidak harus terjadi tepat pada 00detik. Anda dapat memperbarui lebih sering / terus menerus jika itu lebih nyaman, tetapi hasilnya tentu saja masih dapat terbaca - tidak ada noda di seluruh layar.

Memasukkan

Tidak ada

Keluaran

  • Seperti dijelaskan di atas. Trailing spasi untuk menggandakan jam ke posisi 60-ish diperbolehkan di kedua garis, garis tambahan juga diperbolehkan.
  • Layar perlu dibersihkan saat menampilkan menit berikutnya: baik dengan perintah layar-jelas atau dengan menambahkan tidak kurang dari 30 baris baru.

Aturan tambahan


mungkin kita memiliki dua ruang antara angka dan garis putus-putus?
Adám

6
"diperbarui satu menit sekali" - Bisakah itu diperbarui lebih sering?
smls

1
@smls Ya, Anda dapat memperbarui sesering yang Anda inginkan. Saya akan mengubah spesifikasi menjadi 'setidaknya satu menit sekali'.
steenbergh

1
@KritixiLithos Itu akan mematahkan perataan dengan dua digit jam (9, 10 atau 23, 00), jadi tidak, tidak diizinkan.
steenbergh

1
Setelah 23, apakah jam berikutnya 24 atau 0?
Kritixi Lithos

Jawaban:


2

MATL , 41 byte

Terima kasih kepada @Kundor karena melihat kesalahan, sekarang diperbaiki

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

Cobalah di MATL online! Tetapi perhatikan bahwa program ini mati setelah 30 detik, jadi sulit untuk menangkap perubahan apa pun dalam output.

Bagaimana itu bekerja

`           % 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

Bisa jadi saya, tetapi pada iterasi kedua, hanya baris teratas yang dicetak ...
steenbergh

@steenbergh Ini bekerja untuk saya dengan menit dan detik, bukan jam dan menit, jadi perubahannya mudah dilihat: matl.suever.net/…
Luis Mendo

1
Yap, bekerja. - pada kenyataannya, mungkin keren untuk memiliki ini sebagai baris 3 dan 4 jam saya sendiri.
steenbergh

@steenbergh: Anda menerima jawaban ini, tetapi tidak valid — ini menunjukkan jam setelah 23 sebagai 24. Saya percaya jawaban benar yang terpendek adalah Ruby satu dengan Value Ink.
Nick Matteo

@kundor Terima kasih telah memperhatikan. Diperbaiki dengan biaya 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

Relatif mudah. Itu adalah string dengan satu spasi di awal. Jamnya lurus. Ini hanya berfungsi pada kalkulator TI-84 + karena TI-83 tidak memiliki jam internal.

Sunting: Terima kasih @kundor karena memperhatikan bahwa saya tidak menutup loop terakhir. Diperbaiki sekarang (+2 byte).

Sunting # 2: Jam pertama harus nol, bukan dua puluh empat. Diperbaiki dengan biaya +14 byte.


Setiap perintah dihitung sebagai satu byte?
Sygmei

@Sygmei Kebanyakan token adalah satu byte, ya. Namun, token seperti Str1, getTime, dan sub(dua byte masing-masing. Anda dapat mempelajari lebih lanjut di tibasicdev.wikidot.com/tokens
Timtech

Anda tidak akan memiliki tautan ke emulator, bukan?
steenbergh

Saya akan merekomendasikan cemetech.net/projects/jstified tetapi ingat bahwa secara moral salah menggunakan ROM dari internet dengan emulator ini kecuali Anda memiliki jenis kalkulator itu sendiri.
Timtech

1
Jangan takut untuk mengklik tautannya, karena emulator itu sah dan meminta Anda untuk mengunggah ROM Anda sendiri sebelum itu bekerja. TI dulu memiliki mereka secara gratis tetapi mereka tidak lagi. Jika Anda dapat menemukan TI-84 dari seorang teman, itu akan menjadi pilihan terbaik.
Timtech

9

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

Catatan: baris ke-10 memiliki spasi tambahan. Bagi saya, %time%format jam dengan ruang terdepan tetapi menit dengan nol di depan. Saya memutuskan nol di depan adalah format output yang lebih mudah, karena yang harus saya lakukan adalah menambahkan 100 jam dan menghapus digit pertama. Menit lebih sulit karena 08atau 09akan menyebabkan kesalahan parse oktal, jadi saya awali dengan 1efektif menambahkan 100 menit, menyesuaikan untuk ini dengan mengimbangi loop dengan tepat, yang merupakan byte lebih pendek daripada mengurangkan 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))

Ini menggunakan pemformatan f-string baru untuk menyimpan satu byte ( f'\n{h+1:2} 'vs. '\n%2d '%(h+1)) Anda dapat mengubah [sleep(9)]ke 1untuk menyimpan 8 byte, tetapi kemudian hanya mem-spam layar.

Disimpan satu byte diubah while 1:...;sleep 60menjadi while[sleep(60)]:..., berkat TuukkaX.

Saya harus menggunakan 5 byte lagi untuk mendapatkan jam berikutnya ditampilkan setelah 23 menjadi 0, bukan 24, karena OP hanya berkomentar. :-(

Dipulihkan satu byte dengan hanya tidur 9 detik, bukan 60.

Menyimpan dua byte menggunakan bit-fiddling untuk mempersingkat (h+1)%24, dipinjam dari jawaban Ruby Nilai Tinta .


Bisakah Anda jelaskan mengapa Anda menempatkan tanda kurung di sekitar kondisi if? Bukankah hanya memiliki ruang antara saat dan tidur menjadi 1 byte, sebagai lawan dari 2 di kedua sisi? EDIT: Sudahlah, itu untuk membuatnya benar. Cukup adil.
Bayangan

1
@shadow: sleepmengembalikan None, yang salah.
Nick Matteo

@ ToivoSäwén: sleepjuga ada dalam timemodul, jadi mengimpor * lebih baik.
Nick Matteo

5

Ruby, 98 95 91 byte

Pembaruan setiap 5 detik. Hanya berfungsi di terminal bergaya Unix.

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

Versi prompt perintah 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}

Bisakah Anda menggunakan backticks alih-alih sistem? `cls`vssystem'cls'
IMP1

Tampaknya tidak, tetapi Anda dapat menggunakan h=t.hourdan kemudian menggunakan hyang kedua t.hour, yang menghemat 3 byte.
IMP1

@ IMP1 memang, backticks tidak berfungsi untuk cls. Terima kasih atas saran Anda yang lain!
Nilai Tinta

@ IMP1 ternyata, puts`clear`adalah cara untuk pergi jika Anda menggunakan terminal Unix. Itu tidak bekerja dengan prompt perintah Windows cls.
Nilai Tinta

Untuk windows, Anda dapat puts"\e[H\e[2J"menghapus konsol, yang saya pikir mencukur empat byte. Itu akan membuat baris pertama Anda dibacaloop{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}

Cobalah sekali dengan batas waktu satu detik.

Atau coba versi yang diubah yang menampilkan hasil menjalankan selama beberapa jam.

Diperluas:

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
}

Operator apa yang didukung oleh 'segitiga menghasilkan'? Di [\+]dalamnya menambah dan [\-]sepertinya mengurangi. Apakah ini berfungsi dengan multiplikasi dan semacamnya?
Yytsi

@ TuukkaX Ini seharusnya bekerja dengan hampir semua operator infiks. Pada dasarnya sama dengan [+] LISTyang mengurangi, kecuali itu memberi Anda nilai menengah. Lihat halaman dokumen untuk produk
Brad Gilbert b2gills

4

QBasic, 120 127 121 byte

Jangan menjalankan ini terlalu lama atau laptop Anda akan terbakar. Sekarang 99.several9% lebih hemat CPU.

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

Tanpa penjelasan dan penjelasan

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

Kami mulai dengan membersihkan layar, lalu mendapatkan jam dan menit saat ini dari TIMER, yang mengembalikan jumlah detik sejak tengah malam.

Ini adalah pertama kalinya saya mencoba PRINT USING, jadi saya senang menemukan bahwa itu tidak menderita dari kekhasan QBasic yang biasa bahwa angka positif dicetak dengan ruang terdepan. ##sebagai penentu format memastikan bahwa angka satu digit disejajarkan dengan benar dan diisi dengan spasi, sesuai kebutuhan. Kami harus menggunakan loop untuk tanda hubung, sayangnya, karena QBasic tidak memiliki fungsi pengulangan string. (Jika saya salah, tolong beri tahu saya!)

Semua PRINTpernyataan diakhiri dengan ;untuk menekan baris baru; tetapi setelah tanda hubung, kita perlu baris baru; dengan demikian, soliter ?setelah FORloop dalam .

The SLEEP 1sekarang diperlukan. Tanpanya, layar menjadi sangat cepat setelah mencetak sehingga hanya akan berkedip-kedip. (Saya menggunakan LOCATE 1daripada CLSpada awalnya karena alasan itu, sampai saya menyadari bahwa CLSdengan dengan SLEEPlebih pendek pula.) RUNRestart program dari atas - cara terpendek untuk mendapatkan loop yang tak terbatas.


Bagaimana ini menangani jam terakhir hari itu? Baris teratas berbunyi 23, tapi jam berapa di baris paling bawah?
steenbergh

Saya menggunakan Note7 dan berpikir untuk menjalankan program ini di masa mendatang menggantikan jam status bar saya. Apakah itu ide yang bagus?
owlswipe

@steenbergh Ups, diperbaiki. Akan sangat membantu bagi Anda untuk menyebutkan kasus tepi dalam pertanyaan.
DLosc

@Doscosc Nah, saya hanya bercanda :)). Tapi ya, pintar !!
owlswipe

1
@steenbergh Dia mencetak h MOD 24, jika awalnya h = 23 maka siklus loop berikutnya 24 dan dimodded ke 0. Tapi saya ingin tahu apakah itu bekerja juga. CLS membersihkan baris pertama sehingga tidak pernah ada garis yang dicetak pada layar, kan?
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();}}

Ini hanya memperbarui setiap 30 iterasi loop sementara. 29 iterasi lainnya hanya mencetak baris baru.

Diperbarui

Disimpan 13 14 byte karena bantuan Kevin Cruijssen! Terima kasih!


Hai, selamat datang di PPCG! Pertama-tama, hanya program / fungsi yang diizinkan, dan kode Anda saat ini adalah cuplikan. Anda harus mengelilinginya dengan metode (yaitu void f(){...}dan perlu menambahkan impor yang diperlukan (dalam kasus Anda import java.time.*;). Yang sedang berkata, kode Anda dapat golf di beberapa tempat untuk menurunkannya menjadi 311 byte (bahkan dengan metode yang ditambahkan -deklarasi dan impor). (Karena terlalu lama untuk komentar ini, saya telah menempatkannya di komentar berikutnya .. 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 ) Saya sarankan membaca Tips untuk Golf di Jawa dan Tips untuk golf di <semua bahasa> . Selamat menikmati masa tinggal Anda.
Kevin Cruijssen

@KevinCruijssen Saya memperbarui jawaban saya dan dapat menghemat 3 byte lagi dengan menggunakan notasi lambda. Saya juga mengubah beberapa bagian kode yang Anda berikan, juga, untuk memenuhi spesifikasi (misalnya, for(i=0;i++<60bukannya 61 dan (h<10?bukannya 9. Terima kasih telah memberi tahu saya tentang deklarasi metode dan beberapa kiat bermain golf!
CraigR8806

Ah, 61 bukannya 60 memang kesalahan saya. Saya pikir saya telah menulisnya sebagai for(i=0;++i<61ganti for(i=0;i++<61(dalam kasus kedua ini memang harus 60, dan meskipun jumlah byte yang sama, mungkin lebih jelas / mudah dibaca). Di h<9dalam kode saya sudah benar. Anda h+1<10sebelumnya dan saya hanya mengubah ini h<9dengan menghapus 1 di kedua sisi. :)
Kevin Cruijssen

1
@KevinCruijssen Ha Saya tidak mengerti itu! h<9. Saya akan mengeditnya untuk menghemat 1 byte lagi. Terima kasih lagi!
CraigR8806

4

C, 176 162 161 160 156 byte

Ini adalah kotor penyalahgunaan pointer tapi mengkompilasi dan berjalan seperti yang ditentukan. Pastikan untuk mengkompilasi tanpa optimasi jika tidak, Anda mungkin akan mendapatkan 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));}

Tidak Disatukan:

#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

Pembaruan sekali per detik

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)


Anda dapat menyimpan beberapa byte dengan merestrukturisasi kode sehingga hanya satu pernyataan (dimungkinkan untuk memanggil console.clear()di dalam console.logargumen) dan memberikan tanda kurung yang tidak digunakan sebanyak mungkin. Versi untuk 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'+$:$))).
Luke

Anda dapat menyimpan banyak byte dengan menempatkan jam dan menit ke dalam satu fungsi 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)

menyimpan satu byte berkat @TuukkaX


2
Anda tidak perlu baris baru dan spasi setelahwhile 1:
Wisaya Gandum

Saya mulai kode Anda @ 19: 55. Pukul 20:01, saya mengerti 19 - \n 20 -----------------------------------------------------------.
Jamnya

@steenbergh Saya mencobanya sendiri dengan mengatur jam secara manual dan berfungsi untuk saya.
Ovs

@ovs bukan tantangan jam menyenangkan :-). Ngomong-ngomong, mungkin sesuatu dengan repl.it lalu ...
steenbergh

head-desk Server Repl.it satu jam lebih lambat dari waktu lokal saya ... Dan bahkan tertulis di bagian paling atas konsol. Aku akan melihat diriku keluar, terima kasih ...
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");}}

Versi tidak disatukan

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

Dapatkan pekerjaan selesai! Bisa dipendekkan dengan cara tertentu. Asumsikan unistd.hfile sudah termasuk.

@Neil Terima kasih atas informasinya.

@Seth Terima kasih, untuk menyimpan 8 byte.


IIRC Anda harus memasukkan semua yang diperlukan untuk mendapatkan kode untuk dikompilasi (dalam hal ini, definisi time_tdan struct tm) dalam jumlah byte Anda.
Neil

Alih-alih printf("\n");Anda dapat menggunakanputs("");
Seth

3

Pertama kali bermain golf ...

Powershell, 116 byte (tadinya 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}

Sunting: Dari saran @ AdmBorkBork, ubah Get-Date to date, dan Clear to cls, untuk menghemat 6 byte.


Selamat datang di PPCG, jawaban yang bagus
george

Selamat datang di PPCG! Beberapa golf mudah - Anda dapat menggunakannya clssebagai ganti cleardan (selama Anda menggunakan Windows), datebukan get-date. Saya juga yakin ada beberapa cara yang lebih mudah untuk menghasilkan format - saya bermain dengannya dan saya akan memberi tahu Anda jika saya menemukan sesuatu.
AdmBorkBork

Bagus. Coba ini: 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}. Gunakan LF line break di editor Anda sebagai ganti `` n`
mazzy

3

PHP, 104 105 byte

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

showcase untuk printfkarakter padding khusus:
"%'-Ns"= string pad kiri dengan -ke Nkarakter.

akan mencetak 99 baris baru (setiap 6 detik) alih-alih membersihkan layar.

Baris baru pertama harus karakter tunggal. Jadi, pada Windows, itu harus diganti dengan \n.


2

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

Dalam pengaturan, Anda harus mengabaikan kesalahan non-fatal agar ini berfungsi. Juga, dalam GML, #setara dengan \ndi sebagian besar bahasa.


2

Perl 6 , 104 byte

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

Perlu dijalankan pada terminal yang kompatibel dengan ANSI sehingga urutan kontrol untuk mengatur ulang terminal berfungsi.

Cukup mendasar (karena pendekatan yang lebih membingungkan yang saya coba ternyata lebih lama):

  • DateTime.now.&{" "}.say xx*: Ubah waktu saat ini menjadi string (lihat di bawah) dan ucapkan, dan ulangi semua itu dalam jumlah tak terbatas. String dibangun seperti ini:
    • \ec: Kode kontrol ANSI <ESC>cuntuk mengatur ulang terminal, yang membersihkan layar.
    • {.hour.fmt: '%2s'}: jam, lurus ke 2 kolom
    • : ruang
    • {'-'x.minute}: lari berulang kali menit
    • \n: garis baru
    • {(.hour+1).fmt: '%2s'}: jam berikutnya, lurus ke 2 kolom
    • : ruang
    • {'-'x 60-.minute}: tanda hubung berulang kali 60 dikurangi menit

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

Karena AWKtidak memiliki sleepfungsi bawaan, saya cukup memeriksanya terus-menerus untuk melihat apakah menit telah berubah. Kuncinya adalah itu berfungsi ... benar? :)


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
Tidak bisakah Anda hanya print('\n'*50)alih-alih os.system('cls')bekerja pada * nix dan Windows? Akan menghemat beberapa byte karena Anda dapat kehilangan osimpor dan OP mengatakan bahwa ini diperbolehkan.
ElPedro

Oh, saya tidak membacanya dengan benar. Terima kasih banyak.
Gurupad Mamadapur

Sekadar info, sebagian besar orang cenderung menggunakan <s> </s> di sekitar jumlah byte lama mereka dan kemudian memasukkan jumlah byte baru setelahnya karena menarik untuk melihat kemajuan ketika jawaban ditingkatkan :-) Harus mencoba 3,5 beberapa waktu. Saya masih bekerja dengan Python 2.
ElPedro

1
@ ElPedro Ya saya lupa melakukannya. Saya akan mengedit sekarang.
Gurupad Mamadapur

2

Python, 115 113 byte

menyimpan beberapa byte berkat @kundor dan @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)))

Setidaknya di sistem saya, ini tidak menghapus karakter yang mendasarinya, sehingga jumlah tanda hubung pada baris kedua tidak turun seiring berjalannya waktu. Anda juga dapat menyimpan tiga byte dengan meletakkan loop sementara Anda pada satu baris, dan dua byte dengan mengubah :02format menjadi adil :2.
Nick Matteo

2
Anda dapat memperbaiki masalah yang dijelaskan oleh @kundor dalam 1 byte dengan menambahkan spasi setelah {} yang sesuai.
Phlarx

@kundor diperbaiki! Terima kasih. Saya menyimpan :02format di kanan-pad satu digit jam dengan nol.
dfernan

@kundor * pad kiri satu digit jam dengan nol.
dfernan

@dfernan: Ya, :2bantalan kiri dengan spasi, yang menurut tantangan tidak masalah.
Nick Matteo

2

C # Interaktif (138 Bytes)

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
Bisakah Anda mengurangi ini dengan 1) menyebutkan tanggal var dbukan dt? dan 2) menggunakan sleep(1e3)atau 999bukan 1000?
steenbergh

@steenbergh lihat pembaruan
series0ne

Beberapa hal ... Ini hanya cuplikan bukan metode atau program (tidak yakin apakah itu valid di C # Interaktif), pada dasarnya versi golf kode saya, dan jika seharusnya dikomentari sebagai perbaikan bukan solusi terpisah (meskipun ini spekulasi) dan ada banyak perbaikan kecil yang dapat Anda lakukan di sini, dan apakah Anda bahkan perlu tidur?
TheLethalCoder

@TheLethalCoder Saya secara khusus menempatkan C # Interactive karena ini bekerja di konsol interaktif SAJA. Ini tidak akan berfungsi sebagai program C # standar.
series0ne

Juga perhatikan bahwa ini tidak akan berfungsi ketika jamnya 23 dan ketika menitnya 0
TheLethalCoder

2

PHP, 112 120 byte

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,"-");

Karena tidak ada cara untuk menghapus layar (yang dapat saya temukan) saya harus pergi dengan tumpukan baris baru. Juga pertanyaan yang diperbarui menjadi "setidaknya" satu menit sekali menghemat byte dengan 9alih - alih 60.

sunting: @Titus melihat ada bug di padding jam kedua. Biaya perbaikannya 8 byte.


Menampilkan peringatan ini teks pada stdout bersama dengan output yang benar: 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. Ada sesuatu di Meta tentang itu?
steenbergh

@steenbergh Pemberitahuan itu; itu tidak akan ditampilkan jika Anda menggunakan nilai default (parameter baris perintah -natauerror_reporting(22519);
Titus

jam harus diisi dengan panjang 2
Titus

Poin Hbaiknya , pengaturan untuk tanggal berjalan dari 00-23, tapi saya lupa tentang itu untuk jam kedua.
user59178

Simpan dua byte dengan linebreak fisik.
Titus

2

Bash (3 dan 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

Karena penggunaan $0, skrip ini harus dimasukkan ke dalam file, tidak disisipkan ke bash shell interaktif.

Perintah pertama diatur $dke 60 tanda hubung; itu bergantung pada fakta bahwa baris pertama dari skrip ini adalah 60 karakter. Ini tiga karakter lebih pendek dari yang terbaik yang bisa saya buat:

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

Jika Anda tidak ingin ini menjalankan kotak Anda keluar dari PID atau memori pada akhirnya, Anda dapat menambahkan evalke awal baris terakhir, yang akan menghasilkan 95 byte.


Memberiku kesalahan let: h=09: value too great for base (error token is "09"). Masalahnya adalah bahwa angka nol di depan ditafsirkan sebagai konstanta oktal, jadi 09 tidak valid.
Nick Matteo

Hrm, itu berarti skrip saya rusak dalam beberapa cara. Terima kasih.
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
Saya bisa menyimpan 8 byte lagi menghapus tidur, tapi saya tidak nyaman dengan loop sementara yang tidak terbatas berjalan di komputer saya tanpa tidur ;-)
pLumo

Beberapa optimasi: pindah sleep 9ke kondisi loop sementara; hapus -di depan M dalam format string pada baris 4. Anda juga tidak perlu menggunakan $ di depan nama variabel dalam ekspresi aritmatika, jadi $((60-$m))bisa$((60-m))
Evan Krall

Saya tidak yakin apakah matematika Anda pada saluran 9 akurat: h=23; echo $((10#$h+1))mencetak 24 untuk saya.
Evan Krall

Apa yang salah dengan 24?
pLumo

Saya membutuhkan -M karena $ ((60-08)) memberikan kesalahan.
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);}

Cukup singkat dan mudah :)


Wow ... Cepat sekali. Adakah tips menjalankan Gura? Baru saja mengunduh binari, tetapi menjalankan Gura.exedan menempelkan dalam kode ini memberi saya kesalahan sintaks symbol k is not defined.
steenbergh

Lupa titik koma! Anda dapat mencoba menjalankannya lagi :)
Sygmei

1
Apakah ini diperbarui setiap menit? Konsol tampaknya menjalankan kode ini sekali saja ...
steenbergh

Waduh, tidak melihat bagian itu, harus bekerja sekarang!
Sygmei

Ketika pembaruan, itu harus menghapus layar atau menambahkan 30 baris baru.
Sobat

1

Ok, belum pernah melakukan kode golf dalam beberapa saat, jadi begini susah payah saya :)

Unix Korn Shell: 177 171 170 byte

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

menyambungkan 2 gema menjadi 1, menyelamatkan beberapa byte ... (tidur 9 bukannya tidur 10 menghemat 1 byte: P) lol
Ditto

1

Mathematica, 235 byte

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

Memproses, 204 200 198 197 byte

5 byte disimpan berkat @L. Serné dengan menggunakan terner yang lebih pintar

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

Ini menghasilkan 30+ baris baru untuk setiap pembaruan (yang terjadi ketika frame diperbarui)

Tidak disatukan

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

Mengubah ((i=hour())<10?" ":"")+imenjadi ((i=hour())>9?i:" "+i)akan menghemat 2B dua kali ... Semoga berhasil dengan bermain golf lebih lanjut!
Luke

@ L.Serne terima kasih atas tipnya :)
Kritixi Lithos

Peningkatan lain yang mungkin berhasil: ((i=hour()+1)>24?i=0:i)>9menjadi (i=hour()+1)>9, karena hourmenghasilkan angka dalam kisaran 0-23, dan bahkan dengan 1 ditambahkan, itu tidak akan pernah lebih besar dari 24. Juga, Anda harus memindahkan kenaikan idi dalam kondisi dalam forloop. seperti yang Anda lakukan di loop terakhir. Harus menyimpan total 13B.
Luke

@ L.Serné Untuk poin pertama, saya masih harus memasukkan ternary karena 23 +1 dalam jam 24 jam menjadi 0 (atau setidaknya saya pikir). Selanjutnya, jika saya memindahkan kenaikan idi dalam kondisi for-loop, iakan mulai sebagai 1gantinya 0dan saya perlu menambahkan satu byte lagi i++<=minute()dan bytecount akan tetap sama. Namun demikian, terima kasih telah membantu saya bermain golf 1 byte lebih :)
Kritixi Lithos

1

C, 239 byte

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

Terinspirasi oleh entri Seth dan Abel, ini akan menghasilkan 0 bukannya 24 untuk jam berikutnya, seperti yang diperlukan, dan akan menggunakan 30 baris untuk menghapus layar.


1

SmileBASIC, 55 byte

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

Penjelasan:

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)

Catatan: SmileBASIC hanya memiliki 50 kolom teks, sehingga tidak akan terlihat bagus ...


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

Kode ini mengasumsikan bahwa using System.Threading;baris disertakan.

Kelas penuh:

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

Solusi ini tidak memiliki cara untuk keluar dari loop (asli, berkomentar, menjalankan kode pada utas yang terpisah), sehingga Console.ReadKeypernyataan itu berlebihan. Satu-satunya cara untuk keluar adalah dengan menutup jendela konsol atau Ctrl+Break...
nurchi

Ini hanya potongan kode bukan metode atau program, juga using System.Threading;perlu dimasukkan dalam jumlah byte jika Anda menggunakannya. Sama dengan Using System;.
TheLethalCoder
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.