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 adil18
(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
24
di atasnya. Selama jam ke-23, baris kedua dimulai dengan00
atau0
. - Layar perlu diperbarui setidaknya sekali dalam satu menit, tetapi itu tidak harus terjadi tepat pada
00
detik. 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
- Celah standar dilarang
- kode-golf , jawaban terpendek dalam byte menang.
Jawaban:
MATL , 41 byte
Terima kasih kepada @Kundor karena melihat kesalahan, sekarang diperbaiki
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
sumber
TI-Basic, 94 byte
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.
sumber
Str1
,getTime
, dansub(
dua byte masing-masing. Anda dapat mempelajari lebih lanjut di tibasicdev.wikidot.com/tokensBatch, 197 byte
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 karena08
atau09
akan menyebabkan kesalahan parse oktal, jadi saya awali dengan1
efektif menambahkan 100 menit, menyesuaikan untuk ini dengan mengimbangi loop dengan tepat, yang merupakan byte lebih pendek daripada mengurangkan 100.sumber
Python 3.6,
110114112 byteIni menggunakan pemformatan f-string baru untuk menyimpan satu byte (
f'\n{h+1:2} '
vs.'\n%2d '%(h+1)
) Anda dapat mengubah[sleep(9)]
ke1
untuk menyimpan 8 byte, tetapi kemudian hanya mem-spam layar.Disimpan satu byte diubah
while 1:...;sleep 60
menjadiwhile[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 .sumber
sleep
mengembalikanNone
, yang salah.sleep
juga ada dalamtime
modul, jadi mengimpor * lebih baik.Ruby,
989591 bytePembaruan setiap 5 detik. Hanya berfungsi di terminal bergaya Unix.
Versi prompt perintah Windows,
9592 byte:sumber
`cls`
vssystem'cls'
h=t.hour
dan kemudian menggunakanh
yang keduat.hour
, yang menghemat 3 byte.cls
. Terima kasih atas saran Anda yang lain!puts`clear`
adalah cara untuk pergi jika Anda menggunakan terminal Unix. Itu tidak bekerja dengan prompt perintah Windowscls
.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
Perl 6 , 113 byte
Cobalah sekali dengan batas waktu satu detik.
Atau coba versi yang diubah yang menampilkan hasil menjalankan selama beberapa jam.
Diperluas:
sumber
[\+]
dalamnya menambah dan[\-]
sepertinya mengurangi. Apakah ini berfungsi dengan multiplikasi dan semacamnya?[+] LIST
yang mengurangi, kecuali itu memberi Anda nilai menengah. Lihat halaman dokumen untuk produkQBasic,
120127121 byteJangan menjalankan ini terlalu lama atau laptop Anda akan terbakar.Sekarang 99.several9% lebih hemat CPU.Tanpa penjelasan dan penjelasan
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
PRINT
pernyataan diakhiri dengan;
untuk menekan baris baru; tetapi setelah tanda hubung, kita perlu baris baru; dengan demikian, soliter?
setelahFOR
loop dalam .The
SLEEP 1
sekarang diperlukan. Tanpanya, layar menjadi sangat cepat setelah mencetak sehingga hanya akan berkedip-kedip. (Saya menggunakanLOCATE 1
daripadaCLS
pada awalnya karena alasan itu, sampai saya menyadari bahwaCLS
dengan denganSLEEP
lebih pendek pula.)RUN
Restart program dari atas - cara terpendek untuk mendapatkan loop yang tak terbatas.sumber
Java 8,
313300299 byteIni hanya memperbarui setiap 30 iterasi loop sementara. 29 iterasi lainnya hanya mencetak baris baru.
Diperbarui
Disimpan
1314 byte karena bantuan Kevin Cruijssen! Terima kasih!sumber
void f(){...}
dan perlu menambahkan impor yang diperlukan (dalam kasus Andaimport 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)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.for(i=0;i++<60
bukannya 61 dan(h<10?
bukannya 9. Terima kasih telah memberi tahu saya tentang deklarasi metode dan beberapa kiat bermain golf!for(i=0;++i<61
gantifor(i=0;i++<61
(dalam kasus kedua ini memang harus 60, dan meskipun jumlah byte yang sama, mungkin lebih jelas / mudah dibaca). Dih<9
dalam kode saya sudah benar. Andah+1<10
sebelumnya dan saya hanya mengubah inih<9
dengan menghapus 1 di kedua sisi. :)h<9
. Saya akan mengeditnya untuk menghemat 1 byte lagi. Terima kasih lagi!C,
176162161160156 byteIni adalah kotor penyalahgunaan pointer tapi mengkompilasi dan berjalan seperti yang ditentukan. Pastikan untuk mengkompilasi tanpa optimasi jika tidak, Anda mungkin akan mendapatkan segfault.
Tidak Disatukan:
sumber
JavaScript (ES6), 162 byte
Pembaruan sekali per detik
sumber
console.clear()
di dalamconsole.log
argumen) 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'+$:$)))
.m=>`0${h++} \.slice(-3)+'-'.repeat(m)
.Python 2,
131129127 bytemenyimpan satu byte berkat @TuukkaX
sumber
while 1:
19 - \n 20 -----------------------------------------------------------
.C
251267251 byteVersi tidak disatukan
Dapatkan pekerjaan selesai! Bisa dipendekkan dengan cara tertentu. Asumsikan
unistd.h
file sudah termasuk.@Neil Terima kasih atas informasinya.
@Seth Terima kasih, untuk menyimpan 8 byte.
sumber
time_t
danstruct tm
) dalam jumlah byte Anda.printf("\n");
Anda dapat menggunakanputs("");
Pertama kali bermain golf ...
Powershell, 116 byte (tadinya 122)
Sunting: Dari saran @ AdmBorkBork, ubah Get-Date to date, dan Clear to cls, untuk menghemat 6 byte.
sumber
cls
sebagai ganticlear
dan (selama Anda menggunakan Windows),date
bukanget-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.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`PHP,
104105 byteshowcase untuk
printf
karakter padding khusus:"%'-Ns"
= string pad kiri dengan-
keN
karakter.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
.sumber
Bahasa GameMaker, 134 byte
Dalam pengaturan, Anda harus mengabaikan kesalahan non-fatal agar ini berfungsi. Juga, dalam GML,
#
setara dengan\n
di sebagian besar bahasa.sumber
Perl 6 , 104 byte
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>c
untuk 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 menitsumber
AWK, 190 byte
Karena
AWK
tidak memilikisleep
fungsi bawaan, saya cukup memeriksanya terus-menerus untuk melihat apakah menit telah berubah. Kuncinya adalah itu berfungsi ... benar? :)sumber
Python 3.5,
127120117bytesumber
print('\n'*50)
alih-alihos.system('cls')
bekerja pada * nix dan Windows? Akan menghemat beberapa byte karena Anda dapat kehilanganos
impor dan OP mengatakan bahwa ini diperbolehkan.Python,
115113 bytemenyimpan beberapa byte berkat @kundor dan @Phlarx
sumber
:02
format menjadi adil:2
.:02
format di kanan-pad satu digit jam dengan nol.:2
bantalan kiri dengan spasi, yang menurut tantangan tidak masalah.C # Interaktif (138 Bytes)
sumber
d
bukandt
? dan 2) menggunakansleep(1e3)
atau999
bukan1000
?PHP,
112120 byteKarena 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
9
alih - alih60
.sunting: @Titus melihat ada bug di padding jam kedua. Biaya perbaikannya 8 byte.
sumber
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?-n
atauerror_reporting(22519);
H
baiknya , pengaturan untuk tanggal berjalan dari 00-23, tapi saya lupa tentang itu untuk jam kedua.Bash (3 dan 4): 90 byte
Karena penggunaan
$0
, skrip ini harus dimasukkan ke dalam file, tidak disisipkan ke bash shell interaktif.Perintah pertama diatur
$d
ke 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:Jika Anda tidak ingin ini menjalankan kotak Anda keluar dari PID atau memori pada akhirnya, Anda dapat menambahkan
eval
ke awal baris terakhir, yang akan menghasilkan 95 byte.sumber
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.BASH,
165141155 bytesumber
sleep 9
ke 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))
h=23; echo $((10#$h+1))
mencetak 24 untuk saya.Gura , 138 byte
Cukup singkat dan mudah :)
sumber
Gura.exe
dan menempelkan dalam kode ini memberi saya kesalahan sintakssymbol k is not defined
.Ok, belum pernah melakukan kode golf dalam beberapa saat, jadi begini susah payah saya :)
Unix Korn Shell:
177171170 bytesumber
Mathematica, 235 byte
sumber
Memproses,
204200198197 byte5 byte disimpan berkat @L. Serné dengan menggunakan terner yang lebih pintar
Ini menghasilkan 30+ baris baru untuk setiap pembaruan (yang terjadi ketika frame diperbarui)
Tidak disatukan
sumber
((i=hour())<10?" ":"")+i
menjadi((i=hour())>9?i:" "+i)
akan menghemat 2B dua kali ... Semoga berhasil dengan bermain golf lebih lanjut!((i=hour()+1)>24?i=0:i)>9
menjadi(i=hour()+1)>9
, karenahour
menghasilkan angka dalam kisaran 0-23, dan bahkan dengan 1 ditambahkan, itu tidak akan pernah lebih besar dari 24. Juga, Anda harus memindahkan kenaikani
di dalam kondisi dalamfor
loop. seperti yang Anda lakukan di loop terakhir. Harus menyimpan total 13B.i
di dalam kondisi for-loop,i
akan mulai sebagai1
gantinya0
dan saya perlu menambahkan satu byte lagii++<=minute()
dan bytecount akan tetap sama. Namun demikian, terima kasih telah membantu saya bermain golf 1 byte lebih :)C, 239 byte
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.
sumber
SmileBASIC, 55 byte
Penjelasan:
Catatan: SmileBASIC hanya memiliki 50 kolom teks, sehingga tidak akan terlihat bagus ...
sumber
C #
181176Kode ini mengasumsikan bahwa
using System.Threading;
baris disertakan.Kelas penuh:
sumber
Console.ReadKey
pernyataan itu berlebihan. Satu-satunya cara untuk keluar adalah dengan menutup jendela konsol atauCtrl+Break
...using System.Threading;
perlu dimasukkan dalam jumlah byte jika Anda menggunakannya. Sama denganUsing System;
.