Terapkan Stopwatch digital sederhana , yang akan menampilkan waktu berlalu dalam detik dan menit, seperti yang dijelaskan di bawah ini.
Penting
Silakan baca bagian Tampilan dan Kontrol !
Tampilan
Waktu berlalu, harus ditampilkan dalam MM:SS
format, dengan mengganti string waktu yang sebelumnya ditampilkan "di tempat" (membersihkan seluruh atau sebagian layar juga diperbolehkan).
Stopwatch harus diperbarui setidaknya setiap detik.
Contoh:
0 menit, 0 detik
00:00
0 menit, 33 detik
00:33
1 menit, 50 detik
01:50
Awalnya, Anda bisa mulai dengan '00: 00 'atau dengan nilai lain apa pun dalam rentang [00: 00-59: 59].
Setelah Stopwatch Anda mencapai 59:59
, itu harus mengatur ulang ke 00:00
dan melanjutkan lagi.
Anda dapat menggunakan basis yang berbeda (bukan desimal) atau bahkan sistem angka yang berbeda jika Anda inginkan, selama Anda mengikuti pola umum.
Misalnya 13:03
bisa ditampilkan sebagai:
13:03
0D:03
N:D
10101:3
XIII:III
Berhati-hatilah bahwa jika Anda menggunakan sistem / pangkalan angka non-desimal, itu harus dikodekan menggunakan karakter ASCII (atau Unicode) yang dapat dicetak, misalnya menggunakan dua byte biner (tidak dapat dicetak) selama beberapa menit dan detik tidak diperbolehkan.
Anda juga harus meninggalkan-pad output Anda dengan nol yang sesuai, jika sistem numerik Anda memungkinkan untuk itu.
Mengganti karakter pemisah :
dengan karakter lain yang dapat dicetak (termasuk digit) juga dapat diterima.
Kontrol
Stopwatch harus mulai dijeda , dan tetap dalam kondisi ini, sampai pengguna secara eksplisit memulainya , dengan menekan tombol 'control' (lihat di bawah).
Jika, ketika stopwatch menghitung, pengguna menekan kembali tombol 'control' , stopwatch harus berhenti (menjaga waktu saat ini), sampai tombol 'control' ditekan sekali lagi.
The 'kontrol' kunci dapat keystroke tunggal, misalnya s
, atau kombinasi dari kunci, misalnya Ctrl+Shift+X
, tetapi harus 'atom', menekan beberapa tombol secara berurutan, misalnya s
kemudian Enter
, yang tidak diperbolehkan .
Kunci 'kontrol' yang sama (atau kombinasi) harus digunakan untuk menjeda dan melanjutkan stopwatch.
Anda harus menggunakan kunci 'kontrol' tertentu , yaitu 'kunci apa saja' tidak diperbolehkan.
Atau, Anda dapat menggunakan klik mouse tunggal atau ganda, alih-alih menekan tombol untuk 'kontrol'.
Aturan
- Ini adalah kode-golf , jawaban terpendek dalam byte menang;
- Lubang kode-golf standar berlaku;
- Program Anda harus (secara teoritis) mampu berjalan selamanya.
sumber
00:05
dicetak, dan kemudian di beberapa titik dilanjutkan lagi, haruskah00:06
muncul 3000 milidetik setelah tombol resume ditekan, atau boleh-boleh saja mencetaknya satu detik penuh setelah tombol resume ditekan?Jawaban:
SmileBASIC,
867771 byteDIALOG
menampilkan kotak teks di layar sentuh.N
adalah jumlah detik kotak teks akan tetap di layar sebelum menghilang. JikaN
adalah0
, tetap sampai pengguna menekan tombol pada layar sentuh.DIALOG
Kembali1
jika pengguna menekan tombol, dan0
jika ditutup secara otomatis. Jadi ketika pengguna menekan tombol pause, ia kembali1
, dan waktu tampilan diatur ke0
, menghentikan stopwatch. Setelah pengguna menekan tombol lagi, kami mengatur waktu tampilan kembali ke1
, melanjutkan timer. Pada dasarnya, setiap kaliDIALOG
kembali1
, waktu tampilan dialihkan antara1
dan0
menggunakan!=
, yang eqivilant ke XOR logis selama kedua input adalah 1 atau 0.sumber
Python 2,
167129 byte-36 byte * karena menggunakan ide Maltysen untuk menangkap
ctrl-c
menggunakan pengecualian - berikan kredit!-4 byte berkat DLosc (init
n
danb
0 bukanf()
)-1 byte berkat FlipTack (gunakan
p^=1
bukanp=1-p
)-2 byte terima kasih kepada Felipe Nardi Batista (hapus penentu presisi)
Bekerja sama seperti aslinya, di bawah ini, tetapi dengan urutan tombol kontrol
ctrl+c
.(Diuji oleh saya dengan Python 2.7.8 di Windows 7, 64bit;
Diuji oleh Brian Minton dengan Python 2.7.13 di linux, 64bit)
* Juga menciutkan
if
pernyataan ke pencarian daftar untuk mendapatkantry
sebagai satu-liner.Asli saya:
(Diuji oleh saya dengan Python 2.7.8 pada Windows 7, 64bit - kode ini, bagaimanapun, adalah Windows spesifik karena penggunaan
msvcrt
perpustakaan)Kunci kontrol adalah 'p'.
n
danb
diinisialisasi dengan nilai yang sama pada saat start-up, memberikan "offset" 0;p
diinisialisasi ke 0, menunjukkan keadaan dijeda.Setiap kali tombol kontrol ditekan, nilai
p
akan diaktifkan. Ketika beralih dari keadaan dijeda ke keadaan aktifb
diperbarui ke nilai baru menjaga setiap arus offset dari keadaan aktif sebelumnya denganb-n
.Selama keadaan aktif
n
berulang kali diperbarui ke waktu saat ini dengan menelepontime.time()
.Perbedaan antara
n
danb
,,t
adalah jumlah total detik (termasuk bagian fraksional) yang berlalu selama keadaan aktif.Menit yang berlalu kemudian
t/60
dan masing-masing menit dan detik ditampilkan dengan mod 60 dengan(t/60%60,t%60)
. Angka nol terdepan untuk masing-masing menggunakan pemformatan string dari bagian integer'...%0.2d...'
. Mencetak tuple (trailing,
) di mana item pertama memiliki carriage return (yang\r
) menyebabkan teks yang dicetak sebelumnya ditimpa.sumber
^=
beralih di beberapa titik selama formulasi..
masuk%0.2d
? itu berfungsi dengan baik sebagai%02d
Python -
160159143 byteTerima kasih kepada @JonathanAllan karena telah menyelamatkan saya 18 byte!
Hanya menggunakan pustaka builtin, jadi kunci kontrolnya adalah
ctrl-c
, menangkapnya denganexcept keyboardInterrupt
.sumber
except:
? Saya memiliki versi kerja saya yang melakukannya ...bash + Utilitas Unix, 90 atau 93 byte
Versi 90-byte:
Versi 93-byte:
Ctrl-C adalah karakter resume / pause. Spasi adalah pembatas antara menit dan detik.
Perbedaan antara kedua versi adalah bahwa program 90-byte akan bekerja selama 2 ^ 63 detik (pada saat itu, bash akan memberi saya integer overflow).
Versi 93-byte akan benar-benar berfungsi selamanya.
Masalah aslinya termasuk persyaratan: "Program Anda harus (secara teoritis) mampu berjalan selamanya."
Jika berjalan selama 2 ^ 63 detik sudah cukup untuk memenuhi persyaratan itu, maka solusi 90-byte berfungsi. Durasi itu lebih dari 20 kali usia alam semesta!
Jika program harus dapat berjalan lebih lama dari itu, saya harus menggunakan solusi 93-byte.
Saya mungkin harus menunjukkan bahwa solusi ini, serta setidaknya beberapa yang lain diposting, akan sangat lambat jatuh di belakang waktu yang telah berlalu. Selip ini karena program tidur selama satu detik antara setiap eksekusi tubuh loop, tetapi tubuh loop memang membutuhkan waktu yang sangat sedikit untuk dieksekusi. Ini akan menjadi tidak penting dalam praktik.
sumber
Initially, you can start with '00:00' or with any other value in range [00:00-59:59]
, yang akan tetap di layar sampai Anda menekan 'kontrol' untuk pertama kalinya. Maaf jika saya belum dapat merumuskan ini dengan cukup jelas!QBasic,
213211 byteKunci kontrol adalah tab. Membiarkan ini berjalan dapat menyebabkan laptop terbakar. Anda telah diperingatkan.
Ini sedang beraksi, berhenti di 10, 15, dan 20 detik:
Tidak diikat dan dikomentari
Perhatikan bahwa nilai-nilai
TIMER
adalah floating-point. Ini tidak mempengaruhi output, karenaMOD
dan\
memotong ke bilangan bulat. Tapi itu menambah akurasi jumlah waktu yang dihemat: jika Anda menjeda penghitung waktu tepat sebelum tanda centang, Anda akan melihat ketika Anda memulai lagi bahwa jumlahnya berubah dalam waktu kurang dari satu detik.sumber
Batch, 132 byte
Menekan
n
akan (un) menghentikan penghitung waktu. Kedipan output dapat dikurangi dengan biaya tiga (atau empat) byte.sumber
Bash murni, 141 byte
Ini tidak menggunakan apa pun kecuali Bash bawaan (tidak ada alat eksternal). Karakter kontrolnya Ctrl-Z, sehingga
SIGTSTP
penanganan standar menjeda stopwatch.set -m
memungkinkan kontrol pekerjaan , yang biasanya tidak aktif dalam skrip.&
) .read -t 1
menunggu satu detik untuk input dari pengguna , lalu gagal.until
Loop terus selamaread
terus gagal.printf
menampilkan waktu yang diisi dengan benar dan terformat$[s=s>3598?0:s+1,s/60]
ekspansi aritmatika pertama menghitung waktu yang diperbarui, memeriksa apakah akan membungkus dan menambah penghitung detiks
, dan kemudian mengembalikan divisi lantais/60
.$[s%60]
memberikan sisa detik.trap
handler untukTSTP
, sinyal yang Ctrl-Zdihasilkan. Ketika Ctrl-Zditekan saat skrip luar berjalan, skrip akan berjalanfg>/dev/null
dan mengembalikan subshell ke latar depan .>/dev/null
diperlukan untuk berhentifg
mencetak perintah subkulit setiap waktu.00:00
dan mengirimkanSTOP
sinyal ke proses anak$!
, yang akan menghentikan proses.read
menunggu input selamanya, menjaga skrip tetap hidup.Jika Ctrl-Zditekan saat subshell foregrounded, itu akan menghentikan sementara eksekusi dan mengembalikan skrip luar ke foreground, di mana ia akan menunggu diam-diam. Jika skrip luar diletakan di depan, penangan perangkap akan melanjutkan eksekusi subkulit, dan itu akan dihitung kembali.
sumber
Javascript di konsol Chrome, 143 byte
Saat dimasukkan dalam konsol, penghitung masuk ke 00:00 dan kemudian memungkinkan kontrol yang menekan tombol pada dokumen.
Tidak banyak keajaiban terjadi, terutama
(i/60)|0
lantai nomornyaDilakukan dan diuji di konsol Chrome
sumber
m=s=g=i=0;(f=document).onclick=_=>g++;setInterval("g%2&&f.close(f.write(`${(m=i/60%60|0)>9?m:'0'+m}:`+((s=i++%60)>9?s:'0'+s)))",1e3)
HTML + JavaScript (ES6),
191 192 187 183174 bytePenjelasan
Klik timer untuk memulai atau menghentikan stopwatch. Dengan demikian, satu klik adalah kunci kontrol . Pemisah antara dua nilai adalah titik dua.
Setiap kali pengguna mengklik klik, nilai
b
dicentang. Ini diinisialisasi0
yang dievaluasifalse
, sehingga serangkaian kode dievaluasi setiap 1000 milidetik. Ini mengatur variabel ke id interval, sehingga bisa dihentikan nanti. Jikab
berisi angka, itu dievaluasitrue
, sehingga interval dihentikan. Ini mengembalikan nilaiundefined
, sehingga siklus berlanjut.String kode mengubah html elemen dengan id
a
(stopwatch). Pertama menit diurai dengan mengambil nilai stopwatch sebelumnya, membaginya dengan titik dua, dan mendapatkan nilai menit, yang meningkat sebesar 0 jika nilai detik tidak 59 (lebih besar dari 58), dan 1 jika tidak, modulo 60 Kemudian nilai ini diisi. Lalu datanglah tanda titik dua, dan terakhir, detik. Kode hanya mendapatkan nilai lama, meningkatkannya dengan 1, mengambil modulo 60 dan secara opsional menambahkannya.sumber
C
309179 byteVersi tidak disatukan:
Penggunaan: Tekan Enteruntuk Menjeda dan Melanjutkan Stopwatch.
Penjelasan:
break
pertamawhile
dan tunggu hingga berikutnya Enter.goto
pertamawhile
dan lanjutkan penghitungan.Sekarang, saya tahu
goto
adalah praktik pengkodean yang buruk di C, tapi saya tidak bisa mencari cara lain.sumber
getchar()
blok sampai beberapa karakter ditekan.m=0,s=0;
gagal, karena Anda tidak mendeklarasikan variabel-variabel ini di mana pun.Javascript, 124 byte
'Kunci kontrol' adalah klik pada dokumen. Untuk menguji ini, rekatkan kode di konsol atau dalam file html di dalam
<script>
tag.Penjelasan:
Diuji di Chrome
sumber
PHP,
9491 byteSaya berasumsi bahwa 32 adalah kode kunci untuk spasi (yang mungkin bukan);
Saat ini saya tidak memiliki cara untuk menguji ncurses. Tetapi sisa kode berfungsi dengan baik.
dimulai pada
00:00
, tetapi bertambah segera ketika jeda berakhirJika Anda (seperti saya) tidak memiliki ncurses, Anda dapat menguji dengan mengganti
date
parameter kedua dengan$t+=$r^=!rand(sleep(1),19);
atau$t+=$r^=++$x%20<1+sleep(1);
. (sleep
selalu kembali0
.)kerusakan
sumber
C # 220 Bytes
Golf
Menggunakan
s
tombol untuk memulai / berhenti. Seluruh program bekerja dengan mengingat penggunaan TimeDeltaDateTime.Now
Kebanyakan C # -Magic di sini berasal dari fitur C # 7.0
using static
.sumber
Bash, 65 byte
trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}
Perhatikan bahwa itu harus ditulis ke skrip file agar berfungsi dengan benar, atau, coba:
bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
Versi lanjutan untuk menjelaskannya:
The
%(...)T
format yang printf berlaku di bash 5 +.sumber
00:00
dan menambah penghitung saat Anda menekanCtrl-C
. Tidak ada animasi dari timer. (Diuji pada bash 5.0.7)bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
. @roblogicbash -c
:)C (gcc) ,
121115 byteCobalah online!
Mengatur pengendali sinyal untuk SIGINT, yang dipicu dengan menekan control-C. Kami menyimpan offset waktu
b
, dan menampilkan waktu jam dinding dikurangi offset waktu. Jika kita dijeda, tambahkan basis waktu setiap kali jam dinding berdetak untuk membekukan waktu yang ditampilkan.Terima kasih kepada @ceilingcat untuk mencukur 6 byte!
sumber
Zsh + Gnu date, 242 byte
Menampilkan 1/100 detik! Ini membutuhkan terminal interaktif, tetapi ini adalah tautan TIO .
Tekan Enteruntuk memulai / menghentikan timer; Ctrl-Cuntuk keluar.
Komentar (agak ketinggalan zaman):
sumber
Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 byte tokenized dan BASIC
{clear}
dalam daftar adalahSHIFT+CLR/HOME
yang menampilkan sebagai satu karakter PETSCII ketika mengikuti tanda kutip pembukaan, sedangkan{home}
adalahCLR/HOME
kunci tanpa perubahan pada kondisi yang sama mengikuti tanda kutip pembukaan.Gunakan bilah spasi sebagai kunci kontrol.
Untuk bekerja dengan Commodore 128 di BASIC 7, ubah daftar di baris berikut:
Menambahkan tujuh token tambahan ke penghitungan (karena semua angka disimpan dalam BASIC sebagai 7 byte, demikian
goto10
juga 8 token byte sedangkangoto
hanya 1).sumber