Tugas Anda adalah membuat program yang mengukur seberapa cepat Anda bisa mengetik huruf-huruf alfabet bahasa Inggris.
- Program ini hanya akan menerima huruf kecil
a
kez
dalam urutan abjad. - Setiap huruf digaungkan sebagai diketik pada baris yang sama (tanpa baris baru atau pemisah lainnya antara huruf)
- Jika Anda mengetik karakter yang tidak valid, program akan menampilkan
Fail
pada baris baru dan keluar. - Jika Anda mengetikkan semua 26 huruf, program akan, pada baris baru , menampilkan waktu dalam milidetik yang diperlukan dari yang pertama hingga yang terakhir dan keluar.
- Timer dimulai ketika Anda mengetik huruf pertama,
a
.
Output contoh:
b
Fail
abcdefgg
Fail
abcdefghijklmnopqrstuvwxyz
6440
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
code-golf
date
alphabet
interactive
Danko Durbić
sumber
sumber
Fail
tanpa judul baris baru? (mis.abdFail\n
atauabd Fail\n
))Fail
atau milidetik) harus di baris baru, seperti pada contoh. Sebagian besar jawaban sudah mengasumsikan ini.Jawaban:
HTML (JavaScript (ES6)),
129126117 byteKlik pada input dan mulai mengetik! Juga, mengetik saya menyebalkan; Saya membutuhkan waktu sekitar 5 detik bahkan dengan latihan. Sunting: Disimpan 2 byte berkat @HermanLauenstein dengan beralih bahasa. Disimpan 3 byte berkat @ qw3n. Disimpan 9 byte berkat @tsh.
sumber
<input id=i><script>l=0;n=Date.now;i.onkeypress=e=>e.charCode-97-l?i.outerHTML='Fail':l>24?i.outerHTML=n()-t:t=l++?t:n()</script>
:, -11 byte jika tag penutup tidak diperlukan<input id=i onkeypress=event.which-97-l?i.outerHTML='Fail':24<l?i.outerHTML=n()-t:t=l++?t:n() onfocus=l=0,n=Date.now>
6502 kode mesin (C64 PAL),
189165 byteDemo online (Penggunaan:
sys49152
)Penjelasan:
Ini akan menjadi program kecil jika bukan karena masalah pengukuran milidetik pada C64. Gangguan sistem terjadi kira-kira 60 kali per detik, yang bahkan tidak mendekati. Jadi kita harus menggunakan pengatur waktu perangkat keras di sini yang mendapatkan kutu input dari jam sistem.
Pada mesin PAL, jam sistem tepat 985248 Hz. Oleh karena itu, menginisialisasi timer ke 985 memberikan sesuatu yang dekat dengan kutu milidetik, tetapi itu agak terlalu cepat, kita harus menghitung 986 siklus untuk setiap centang keempat, atau menahan timer untuk satu siklus tunggal. Ini tidak mungkin, tapi kita bisa menahan timer selama 6 siklus dengan urutan
DEC $DD0E
,INC $DD0E
:$DD0E
adalah kontrol timer mendaftar dengan bit 0 beralih dan mematikan, dan kedua petunjuk mengambil 6 siklus, sehingga menulis yang tepat yang berhenti dan memulai Timer persis 6 siklus terpisah. Oleh karena itu kita harus menjalankan urutan ini setiap 6 * 4 = 24 centang. Ini masih belum mutlaktepatnya, timer akan tertinggal 1 milidetik setelah 8 menit dan 12 detik, tetapi mungkin cukup baik - mengimbanginya akan membutuhkan banyak kode.sunting : Nilai awal untuk pengatur waktu harus 984, bukan 985, karena pengatur waktu ini menyala "saat underflow", jadi nilai 0 akan menghitung satu siklus lagi sebelum menembak. Kode diperbaiki, jumlah byte tidak berubah.
Berikut daftar pembongkaran yang dikomentari:
sumber
.starttimer
- akan segera dilakukan :) (dan lebih jauh lagi dengan menggunakan sistemTI
seperti jawaban BASIC ini , tapi saya tidak yakin ini valid, karena Anda dapat melakukan yang lebih baik dalam kode mesin )Bash + coreutils,
1039998 byteHarus dijalankan di terminal.
Uji coba
sumber
3479
cukup cepat! dilakukan dengan baik :)a
segera memberi sayaline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")
dan keluar.date
kekuatan. Milik saya berasal dari GNU coreutils 8.23. Apa yangdate +%s%3N
tercetak pada sistem Anda?15094104833N
- ini adalahdate
utilitas bawaan pada macOS, jika itu membuat perbedaan.date
tampaknya menggunakan strftime, yang tidak dikenali%N
.Python 2 + getch , 116 byte
Terima kasih kepada Ovs dan ElPedro untuk memperbaiki kode dan menghemat 57 byte.
sumber
SOGL V0.12 , 35 byte
Coba Di Sini! - klik jalankan, dan masukkan alfabet di kotak input. Perhatikan bahwa ini mungkin sedikit lamban karena SOGL hanya berhenti sebentar untuk input setiap 100 token yang dieksekusi (dan SOGL cukup lambat). Jika itu mengganggu Anda, jalankan
sleepBI=true
di konsol.Catatan: jangan jalankan ini dalam mode kompatibilitas - itu hanya akan berulang selamanya.
Penjelasan:
sumber
Pascal (FPC) , 176 byte
Cobalah online!
Beberapa trik yang digunakan dalam kode untuk bermain golf:
Real
sebagai alternatif yang lebih pendekTDateTime
, karena seperti yang didefinisikan di sini ,TDateTime
=Double
, yang merupakan tipe titik-mengambang.MilliSecondsBetween
untuk menghitung kesenjangan waktu, kode ini mengalikan perbedaan antara dua nilai floating-point dengan864e5
, yang bekerja karena cara pengkodean Free PascalTDateTime
dijelaskan di sini .catatan:
ReadKey
fungsi sebenarnya tidak mencetak kunci pada konsol, jadi penulisan manual untuk konsolWrite(c)
diperlukan.0
untuk mengetik alfabet karena alasan yang jelas.sumber
for c:='a'to'z'do
ke baris yang sama dengana:=Time;
.Now
daripadaTime
lebih pendek.86398338
?? Saya bisa mengerti jika Anda menggandakan 864e5 karena ada 864e5 milidetik dalam sehari. tetapi bagaimana angka ajaib ini datang?TDateTime
sebagaiDouble
.864e5
Kedengarannya lebih benar, saya akan memperbaiki masalah.Java,
404388354348320318 byteDan di sini saya pikir Java Console sudah verbose ..
Karena Java tidak punya cara mentah untuk mendengarkan penekanan tombol di Konsol afaik, saya menggunakan GUI dengan
java.awt
.-78 byte terima kasih kepada @ OlivierGrégoire .
Penjelasan:
Contoh gif sukses: (Ya, saya mengetik alfabet dengan sangat lambat di sini ..)
Catatan: Ini adalah gif lama. Versi saat ini tidak lagi mencetak penekanan tombol ke Konsol. Dan itu tidak lagi mencetak waktu dengan angka setelah titik desimal.
Contoh gif gagal:
Catatan: Ini adalah gif lama. Versi saat ini tidak lagi mencetak penekanan tombol ke Konsol.
sumber
setVisible(false)
bukannya keluar.show
dandispose
, yang bahkan lebih pendek darisetVisible
. Saya hampir tidak pernah menggunakan GUI Java .. Dan pintar menggunakan inisialisasi kelas daripada memasukkannya ke dalam metode utama. Saya harus ingat itu.TextField
. Juga, Anda bisa menggunakanTextArea
alih-alihTextField
mendapatkan dua byte. Akhirnya,KeyEvent
memilikigetWhen
metode yang memberikan waktu antara zaman dan peristiwa dalam milidetik. Hanya perlu menggunakan itu daripadaSystem.nanoTime()
mendapatkan lebih banyak byte.C # (.NET Core),
245 + 13183 + 41177 + 41 byte+41 byte untuk
using System;using static System.Console
.Belum diuji karena saya menggunakan ponsel dan ini tidak berjalan di TIO.
sumber
int x=0;
dan kemudian lakukanx=1/x;
. Ini harus menghemat 14 byte. Sayangnya kamu butuhx
. Jika Anda mencoba melakukannya,1/0
Anda mendapatkan Divisi dengan kesalahan kompiler nol konstan . 2) -5 byte untuk menggabungkan deklarasic
dengan yang pertamaReadKey
. 3) Ubah kondisi di bagian dalamif
keReadKey!=++c
dan hapusc++;else
untuk -9 byte lainnya.x=1/x
dapat dikurangi menjadix/=x
. Dan saya menambahkanusing static System.Console;
untuk menghemat lebih banyak byte :)i
dan menggunakanc
dalam kondisi loop sebagai gantinya.MSX-BASIC, 126 karakter
TIME
adalah variabel internal MSX-BASIC yang meningkat satu setiap 20 milidetik.sumber
C # (.NET Core) ,
184 + 13 = 197173 + 13 = 186 byteCobalah online!
Sayangnya TIO tidak dapat menjalankan ini, tetapi berguna untuk mendapatkan jumlah byte.
+13 untuk
using System;
-1 dengan mengubah
i==123
kei>122
. Saya tergoda untuk membuat inii>'z'
.Ucapan Terima Kasih
-10 byte terima kasih kepada @raznagul
Tidak disatukan
sumber
ReadKey
ke kondisi loop sehingga Anda dapat menghapus yang pertamaif
danbreak
.Node.js,
240213 byteEDIT: Disimpan 27 byte berkat Jordan
Versi tidak disatukan:
sumber
C (gcc) , 303 byte
Bekerja pada sistem * nix. Kode mandiri menghapus mode kanonik terminal saat ini untuk memungkinkan membaca karakter tanpa menunggu baris baru:
/! \ Menjalankan program ini akan membuat terminal hampir tidak dapat digunakan.
Tidak dikumpulkan dan berkomentar:
Solusi alternatif (218 byte):
Jika mengkonfigurasi terminal sebelumnya diizinkan, maka kita dapat menyingkirkan bagian dari penanganan kode bagian itu.
Berikut adalah kode yang sama tanpa manipulasi terminal:
Untuk membuatnya bekerja:
contoh runtime:
sumber
Commodore BASIC v2 - 113 byte
Huruf kapital harus digeser.
Terima kasih kepada Felix Palmen karena menunjukkan beberapa kesalahan ketik, spesifikasinya
cobalah
sumber
TI
bertambah di dalamnya) Saya dianggap tidak cocok untuk ketepatannya, tapi saya kira itu permainan yang adil di sini karena tidak ada cara untuk berbuat lebih baik di BASIC :) Tetap, menempelkan ini di wakil, saya dapatkan kesalahan sintaksis dalam1
- bantuan apa pun?1on-(f=26)gO4:gEa$:ifa$=""tH1
Nitpicks: 1.) output berada di baris yang sama, 2.) output all-caps - Saya pikir Anda harus memperbaikinya, saya tidak akan mengambil banyak byte lagian :)Perl 5,
7993 +31 (-MTerm :: ReadKey -MTime :: HiRes = time) bytes$|=1
tidak cukup untuk mengatur terminal dalam mode mentah,stty -icanon
harus dijalankan sebelum atauuntuk melihat karakter di terminal setelah menjalankan perintah:
stty echo
ataustty echo icanon
sumber
ReadKey
! Anda dapat menyimpan beberapa byte di sana-sini,1e3
untuk1000
,$s||=time
dan jika Anda atur$s
terlebih dahulu lalu panggilReadKey
, Anda dapat menukar keluarmap
ke postfixfor
. Saya ingin mengatakandie
alih-alihexit print
, tapi saya pikir Anda ada di sana ... Saya bermain-mainprintf"\n%i"
tapi itu berakhir lebih besar, dan saya berpikir untuk menggunakan,$-
bukan$s
, tapi itu bodoh! :)$|=1;
, juga $ s || = waktu tidak dapat menukar peta karena timer harus dimulai setelah tombol pertama ditekan, dandie
akan bergemaFail
di stderr bukannya stdout.exit print
sangat lama! Maaf, saya tidak berpikir saya menjelaskan pemikiran saya denganfor
benar:$s||=time,ReadKey eq$_||exit print" Fail"for a..z
harus bekerja saya pikir ... Mungkin bahkan$|=$s||=...
atau$|=map...
jika Anda lebih suka pendekatan itu! Pikir Anda cukup banyak berhasil!$|=map..
tidak menyetel input yang tidak dibangun pada terminal baru (saya mengalami kesalahan saat menghapus, ReadMode 3, karena saya sedang menguji di sesi yang sama), dan$s||=time
sebelum ReadKey pertama akan memulai timer terlalu dini$|
, tapi sekali lagi, ini menyimpan setelah loop yang sudah terlambat! Anda selangkah lebih maju!Aceto , 70 byte
Saya mulai dengan menetapkan tanda tangkap dan mirroring secara horizontal (
@|
), jika nilai pada stack benar. Ini bukan awalnya, dan nanti akan selalu begitu. Kami akan melompat kembali ke sini nanti jika kunci yang salah dimasukkan. Selanjutnya, kita mendorong a pada stack ('a
), lalu kita menduplikasinya dan membaca satu karakter dari pengguna (d,
). Jika kedua karakter tidak sama (=!
), kita "crash" ($
) dan melompat kembali ke tanda tangkap. Kalau tidak, kita dorong "a" yang lain dan cetak, lalu kita atur waktu saat ini ('apT
).Lalu kita masukkan "loop utama" kami: Kami "menambah" karakter saat ini dan "menambah" karakter (
'apToIc
), lalu kami menduplikatnya, membaca karakter baru, membandingkannya, dan "crash" jika karakternya tidak sama (d,=!$
). Jika kita tidak crash, kita membandingkan karakter saat ini dengan "z" (d'z=|
), jika tidak sama, kita mencetak karakter, maka kita mendorong 1 dan melompat "kondisional" (dalam hal ini: selalu) ke hanyao
dalam kode (awal dari loop utama kami). Jika sama dengan z, kami melakukan mirroring secara horizontal ke beberapa ruang kosong di atasnya. Kami mencetak "z", lalu mendorong waktu saat ini (dikurangi waktu mulai;t
) dan kemudian mengalikan angka 1000 (didapat dengan menaikkan 10 ke kekuatan ketiga;91+3F
) dengan itu (karena kami mendapatkan detik, bukan milidetik). Kemudian kami mencetak baris baru, waktu, dan keluar (pX
).Jika kita pernah crash (input buruk oleh pengguna), kita melompat ke awal. Karena kita sekarang akan memiliki beberapa nilai kebenaran pada stack, kita akan mirror secara horizontal ke
u
, yang membalikkan arah kita bergerak masuk.n
Mencetak karakter baris baru, kemudian kita mendorong"Fail"
stack, mencetaknya, dan keluar (pX
).sumber
Mathematica (ekspresi notebook), 248 byte
Bagaimana itu bekerja
A
DynamicModule
denganEventHandler
yang merespons penekanan tombol huruf kecil. Variabelx
,,s
dant
tahan huruf ditekan sejauh ini, waktu mulai, dan waktu akhir, masing-masing. Begitu kami menyadarix
kesetaraan{"a"}
, kami memulai waktunya; kami menampilkan total waktu yang dihabiskan, atau string yang dibangun sejauh ini, atau"Fail"
tergantung pada kondisi mana yang dipenuhi.Kita dapat menyimpan byte lain dengan
t<1
daripadat==0
jika kita dapat berasumsi bahwa tidak ada yang cukup cepat untuk mengetik alfabet dalam waktu kurang dari satu detik :)Jika Anda mencoba ini di buku catatan Mathematica, perlu diingat bahwa Anda harus mengklik di dalam bingkai sebelum penekanan tombol Anda akan didaftarkan. (Ini adalah alasan bahwa kita membutuhkan bingkai untuk memulai; jika
Framed
tidak ada, maka seluruh objek yang dipilih berubah ketika tombol ditekan, sehingga berhenti dipilih dan Anda harus mengklik lagi.)sumber
C #,
154152 + 13 = 165 byteDisimpan 2 byte berkat komentar Ayb4btu
Kode di atas memiliki spasi untuk membuatnya pas di SE tanpa bilah gulir. Spasi bukan bagian dari jumlah byte
dan 13 byte untuk
using System;
Ini mirip dengan versi Ayb4btu tetapi dengan perbedaan berikut:
Menyimpan datetime sebagai panjang, memungkinkan kita untuk membuat
c
panjang juga, dan memotong pendek deklarasiLoop tidak perlu istirahat terpisah
Sebenarnya tidak lebih pendek untuk digunakan
$"interpreted strings"
dibandingkan dengan menambahkan "\ n" yang diperlukan ke dalam milidetik untuk menjadikannya string untuk inline jikaMenggunakan
for
loop kadang-kadang memungkinkan kita untuk menyimpan karakter lebih dari beberapa saat, meskipun saya pikir ini tidak akan menghemat lebih dari yang setarawhile
Dari Ayb4btu:
s=s==0
bisa menjadis=s<1
, danc==123
bisa menjadic>122
Tidak disatukan
sumber
DateTime
. Anda dapat menyimpan beberapa byte lagi dengan mengubahs=s==0
kes=s<1
(mengandalkan fakta bahwa s tidak akan negatif), dan mengubahi==123
kei>122
.i<123
harus pergi sebelumReadKey()
, jika tidak menunggu karakter lain setelah z sebelum menampilkan waktu.z
harus berarti readkey.keychar mengembalikan 122 ketika pengguna mengetikkan z, c juga 122, maka'z' == 122
berhasil, c kemudian bertambah, kemudian c (sekarang 123) diuji terhadapc<123
dan gagal, menghentikan lingkaran ..?c++
kenaikan ketika aku melihatnya. Namun, saya hanya mencobanya dan ketika saya mengetiknyaabcdefghijklmnopqrstuvwxys
memberi saya waktu bukannya gagal. Saya percaya itu karenac
masih bertambah meskipunKeyChar
cek gagal, oleh karena itu melewatic>122
cek.Processing.org
133142kode pertama tidak keluar
sumber
GCC, windows, 98 byte
Tidak memerlukan input langsung untuk kunci pertama
sumber