Tugasnya adalah menulis kode untuk mengidentifikasi tombol mana yang ditekan pada keyboard. Anda dapat mengasumsikan bahwa hanya satu tombol yang ditekan pada satu waktu dan bahwa ada tata letak keyboard AS standar. Itu adalah tata letak dengan @ lebih dari 2.
Kode Anda harus menampilkan pengidentifikasi unik untuk setiap tombol yang ditekan. Ini termasuk PrtScn, Scroll Lock, Pause, Shift kiri, Shift kanan, Ctrl kiri, Ctrl kanan, Caps Lock, Tab, Enter, Enter pada pad nomor, Num Lock, Insert, Ins pada pad nomor, Backspace, Del, F1 ... F12, Esc, tombol Windows kiri, tombol Windows kanan, Alt, AltGr, kunci aplikasi (menu konteks) dan sebagainya.
Kode Anda harus terus menunggu penekanan tombol dan mengeluarkan identitas mereka sampai terbunuh. Ini harus menampilkan pengidentifikasi segera setelah kunci dirilis. Seharusnya tidak melakukan tindakan lain dari penekanan tombol yang diterimanya dan seharusnya tidak menghasilkan apa pun selain dari pengidentifikasi unik.
Dalam jawaban Anda, tolong tunjukkan apa yang Anda kode output untuk penekanan tombol berikut: Tab, Jeda, Enter, Enter pada pad nomor, kiri tombol Windows, tombol Windows kanan, Masukkan dan Ins pada pad nomor.
Jika Anda memiliki keyboard yang sangat berbeda, tantangannya masih untuk menghasilkan pengidentifikasi yang berbeda untuk setiap tombol pada keyboard Anda.
Jawaban:
kode mesin x86, DOS executable,
29* 28 byteIni adalah executable COM untuk MS-DOS , membutuhkan perangkat keras yang kompatibel dengan IBM PC .
Khususnya pengontrol 8042 PS / 2 atau lebih mungkin emulasi melalui SMM .
Singkatnya, itu harus bekerja di luar kotak di PC mainstream.
Kode sumbernya adalah
Saya telah membagi program menjadi dua bagian.
Bagian pertama berkaitan dengan pembacaan scancodes . Scancode adalah nilai numerik yang terkait dengan setiap kunci.
Perhatikan bahwa ini adalah kode perangkat keras, mereka tidak bergantung pada OS atau rangkaian karakter. Mereka seperti pasangan yang disandikan (kolom, baris) dari kunci.
Setiap tombol memiliki kode kunci, bahkan tombol fungsi aneh non-standar yang ditemukan pada beberapa keyboard (misalnya tombol "buka kalk").
Beberapa kunci memiliki scancode multi-byte, mereka memiliki awalan yang dirancang untuk membuat aliran didekodifikasi dengan hanya melihat urutan byte.
Jadi setiap kunci mendapatkan pengenal uniknya, bahkan CTRL, SHIFT, WinKeys dan sebagainya.
Hanya "istirahat kode", dikirim ketika kunci dilepaskan, diproses, "buat kode" diabaikan.
Former memiliki set bit yang lebih tinggi (bit 7 untuk byte), jadi mudah untuk mengenalinya.
Bagian kedua berkaitan dengan pencetakan byte.
Pencetakan selalu panjang dalam perakitan, kami tidak memiliki bawaan.
Untuk membuatnya singkat, dan karena itu diperlukan untuk menulis pengidentifikasi kunci, saya meninggalkan angka desimal atau hex yang mendukung pengodean pribadi.
A byte xy, di mana x adalah nibble yang lebih tinggi dan y yang lebih rendah dicetak sebagai dua karakter berturut-turut c 0 dan c 1 didefinisikan sebagai:
c 0 = 0x21 + y
c 1 = 0x21 + x
Perhatikan bahwa nibble yang lebih rendah dicetak terlebih dahulu (ini memberi saya swap).
Alasannya adalah untuk memetakan masing-masing dari 16 nilai yang mungkin dari menggigit menjadi karakter ASCII berturut-turut dari '!'.
Sederhananya ini adalah angka hex tetapi dengan
!"#$%&'()*+,-./01
sebagai digit (als) bukan0123456789abcdef
Menjalankannya di DOSBox dan menekan beberapa kunci acak (beberapa di antaranya adalah kunci khusus tetapi perhatikan bahwa sebagai proses Windows, DOSBox tidak dapat menangkap semua kunci) menghasilkan
Perhatikan bahwa program ini tidak pernah berakhir (lebih lanjut, dibutuhkan kontrol penuh dari PC dengan menonaktifkan interupsi) seperti yang saya yakini dimaksudkan oleh pertanyaan (hanya tidak ada pembunuhan proses dalam DOS).
* Mengurangi terima kasih kepada CodyGray .
sumber
IN
instruksi berhasil menjadi lebih kecil dalam hal byte daripada memanggil ROM BIOS interupsi (misalnyaint 16h
, fungsi 10h)?in
instruksi. Itu sebenarnya poin yang sangat bagus yang Anda miliki. Jika Anda belum melakukannya, mengapa tidak mempostingnya sebagai jawaban? :)xchg
dengan akumulator sebagai salah satu register adalah 1 byte, jadi itu lebih baik daripada 2-bytemov
.int 16h
adalah bahwa saya tidak mendapatkan kode pindai untuk tombol shift, kunci gulir, atau jeda / istirahat (mungkin orang lain), dan itu diperlukan oleh tantangan. Solusi Anda membaca input langsung dari I / O berfungsi, meskipun sepertinya bagi saya itu mengembalikan nilai yang sama untuk semua kunci di Ins / Del / Home / End / PgUp / PgDown cluster.Java 7 atau lebih tinggi,
246228 byteTidak Disatukan:
-18 terima kasih kepada @ OlivierGrégoire untuk
show()
,0<0
danimport java.awt.event.*;
Yang mengakibatkan:
Bahkan menangani tombol shift untuk karakter huruf besar, tombol windows, kunci topi, dll ... Anda dapat melihatnya mencetak 'pengubah' juga, yang merupakan 'tombol yang ditahan'.
sumber
HTML (dengan Javascript),
4631 karakter,4631 byteMenggunakan ini untuk membedakan numpad masuk dan kembali, LControl dan RControl ...Tidak lagi sejak apsillers menemukan cara untuk melakukannya dengan panggilan fungsi signle.Output spesifik:
OUTPUT YANG MASIH DENGAN ANGKA ADALAH MEREKA SAYA TIDAK BISA MENGUJI LAPTOP SAYA
TUNGGU AKU AKAN MEMILIKI AKSES KE KUNCI MEREKA
PrtScn -> PrintScreen
Scroll Lock -> ScrollLock
Jeda -> Pause
Shift kiri -> ShiftLeft
Shift kanan -> ShiftRight
Ctrl kiri -> ContrlLeft
Ctrl kanan -> ControlRight
Caps Lock -> CapsLock
Tab -> Tab
Enter -> Enter
Enter pada nomor pad -> NumpadEnter
Num Lock -> NumLock
Sisipkan -> Masukkan
Ins pada pad nomor -> Numpad0
Backspace -> Backspace
Del -> Hapus
F1 ... F12 -> F1 ke F12
Esc -> Melarikan diri dari
tombol Windows kiri -> MetaLeft
kanan Kunci Windows -> MetaRight
Alt -> AltLeft
AltGr -> AltRight (jenis kereta, ia mendeteksi ControlLeft dan kemudian AltRight,tapi itu memang AltRight)
kunci aplikasi (menu konteks) -> ContextMenu
EDIT:
1 byte disimpan pada
;
setelah panggilan fungsi18 byte disimpan berkat Lil 'Bits dan ETHproductions, mereka melihat saya lupa untuk mempersingkat nama func dan var.
32 byte disimpan berkat RogerSpielker, dia perhatikan saya melakukan kode sparated tanpa alasan; dan lagi -2 byte:
onkeydown
->onkeyup
1 byte disimpan: tidak perlu slash akhir
2 byte disimpan berkat CraigAyre:
with()
fungsi2 byte disimpan berkat ASCII-only:
key
sebagai penggantiwhich
4 byte yang disimpan, karena kita memiliki teks, tidak perlu untuk
'-'+
(setiap pengidentifikasi adalah unik tanpa ini) 1 byte disimpan berkat ASCII-only (lagi): tidak ada lagi simbol penutup>
15 byte yang disimpan berkat apsillers, seperti yang dikatakan di atas jawaban saya.sumber
<body onkeydown=return!!alert(event.code)>
harus melakukan trik dengan kembalifalse
padakeydown
Tcl / Tk, 22 karakter
Contoh dijalankan:
Catatan:
pintarmeletakkan lampu latar di tempatnya)sumber
Bash dengan X.org, 21 byte
Sayangnya, saya tidak dapat mengujinya karena saya menggunakan MacBook di Linux - tanpa PrntScr, tanpa keyboard numerik & semua.
xev
adalah alat yang menampilkan acara mouse dan keyboard di bawahX.org
. Saya menyalurkannya ke awk, memfilter garis rata (karena setiap tombol ditampilkan saat tombol ditekan, lalu saat dilepaskan), dan pilih hanya yang berisi(k
- string ini ada di setiap baris yang menjelaskan tombol yang ditekan.sumber
showkey -s
sana: P), atau pada desktop GUI Wayland murni. Ini benar-benar jawaban bash + Xorg.C dan Win32,
240224216205202194191 byteKeluaran
TAB:
F0008C00F0008
PAUSE:
450012C0450012
ENTER:
1C000CC01C000C
NUMPAD-ENTER:
11C000CC11C000C
WINDOWS-LEFT:
15B005AC15B005A
WINDOWS-RIGHT:
15C005DC15C005D
INSERT:
152002CC152002C
NUMPAD-INSERT:
52002CC052002C
Penjelasan
Suntingan
-16 Terima kasih kepada @ugoren
-8: diubah
WNDCLASS
menjadiint
array karena semua 10 anggota adalah 4 byte-11: inisialisasi parsial array wndclass-data, dikurangi menjadi 9 elemen
-3: gunakan
int
mendeklarasikan implisit untuk wndclass-data array-8: hapus baris baru dari format keluaran (tidak diharuskan dalam spesifikasi dan printf segera dihapus tanpa itu); pindah
RegisterClass
keCreateWindow
arg, menggunakan kembaliATOM
; atur nama wndclassm
yang hanya membutuhkan nol-byte di dalamnya sebagai string yang valid.-3: menggunakan kembali
w
var untukMSG
datasumber
<iostream>
+std::cout<<a^b<<"\n"
lebih panjang. Plus, saya pikir Anda perlu menambahkan tipe kembali ke decl fungsi, danm
tidak bisa menjadi implisitint
.for(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
p(x,y,a,b)
dan(void*)p
harus menyimpan beberapa.Java (OpenJDK 8) , 369 byte
Ini tidak dapat dijalankan dengan TIO karena menggunakan antarmuka grafis, tetapi berfungsi di komputer saya.
Tidak Disatukan / Penjelasan:
sumber
setFocusTraversalKeysEnabled(false);
dalam jawaban Anda akan memperbaikinya.Scala 2.10+, 279 karakter, 279 byte
Sekarang ini adalah respon scala :) meskipun rasanya seperti saya melakukan Java. Lagi pula kami tidak dapat mengujinya di TIO.
Sangat menyedihkan kita perlu mendeklarasikan semua metode yang diwariskan walaupun kita tidak menggunakannya: apakah saya dapat menghapusnya dari jumlah byte, karena beberapa flag compiler dapat mengizinkan tidak mendeklarasikannya?
Ini mencetak (seperti untuk respons html-js saya) tombol yang ditekan, "-" dan kemudian "lokasinya".
Contohnya :
PrtScn -> tidak dapat diverifikasi
Scroll Lock -> 145-1
Jeda -> 19-1
Shift kiri -> 16-2
Shift kanan -> 16-3
Ctrl kiri -> 17-2
Ctrl kanan -> 17-3
Caps Lock -> 20-1
Tab -> tidak dapat diverifikasi
Enter -> 10-1
Masukkan pada pad nomor -> 10-4
Num Lock -> 144-4
Masukkan -> 96-1
Ins pada pad nomor -> 96-4
Backspace -> 8-1
Del -> 127-1
F1 ... F12 -> 112-1 hingga 123-1
Esc -> 27-1
tombol Windows kiri -> 524-2
tombol Windows kanan -> 524-3
Alt -> 18- 2
AltGr -> 18-3 (jenis kereta, ia mendeteksi 17-2 dan kemudian 18-3,tetapi memang 18-3)
kunci aplikasi (menu konteks) -> 525-1
Meskipun saya pikir itu tergantung pada komputer: / Saya pada laptop azerty sekarang.
sumber
-std=c89
karena kompiler modern default ke c99 atau c11, tetapi tidak perlu menghitungnya. Jadi saya tidak yakin apa putusannya dari meta kode-golf.TI-BASIC, 19 byte
Berikut ini ilustrasi dari sisa tombol:
Penjelasan:
Sayangnya, ini tidak mungkin dilakukan di Arnold C, jadi saya harus tetap menggunakan TI-BASIC.
sumber
C #, 144 + 601 = 745 byte
Terdiri dari dua kelas, saya tidak bisa berhasil menggabungkan mereka ke dalam satu kelas.
Kelas utama:
Kelas kait:
Output:
137
147
141
142
220
221
174
224
sumber
||
ke|
dan golfs lain yang sejenis tapi otak saya butuh istirahat setelah melakukan itu!public int v;public int c;public int f;
bisa disingkat menjadipublic int v,c,f;
AutoHotkey , 26 Bytes
Tidak dapat menguji (hanya untuk menang), tetapi
M
opsi mengatakanJadi itu seharusnya baik-baik saja.
sumber
WinApi C ( gcc ), 156 byte
Program ini mencetak Kode Virtual-Key Windows yang dikaitkan dengan setiap tombol keyboard input. The
\n
dalamprintf
format string opsional (tapi membuat keluaran ramah-manusia) dan dapat turun untuk skor total 154 byte . Cara mudah untuk mematikan program (tanpa taskmgr) adalah denganCTRL + PAUSE
. Jika Anda memiliki keyboard dengan tombol Fn, program ini tidak dapat mengambilnya karena bahkan tidak diperhatikan oleh Windows.#include <d3d.h>
trik dan inspirasi untukBYTE
array.Program dengan variabel lokal, keterbacaan, dan tanpa peringatan kompiler terlihat seperti ini:
sumber
C (gcc) + Win32, 94
9598105107110byteKode menangkap kunci bahkan setelah fokus hilang.
Tangkapan layar berikut direkam dengan menambahkan spasi di antara keluaran (
printf("%d ",j);
+1 byte) untuk kemudahan penayangan yang lebih baik:Left-ctrl Left-win Left-alt Space Right-alt Right-win Right-menu Right-ctrl Left-shift Z X C Right-shift Left-shift 1 2 3 Num 1 Num 2 Num 3 Left-shift +/= (on the main part) Num + Left-alt PrtScn
Kode digunakan
GetAsyncKeyState
untuk menanyakan status kunci tanpa memeriksa antrian pesan, biasanya lebih real-time daripada pendekatan mode pengguna lainnya (kecuali DirectInput). Pendekatan ini banyak digunakan dalam keyloggers.(j<16||j>18)
menyaring Ctrl / Alt / Shift biasa. 16/17/18 dipicu setiap kali kiri atau kanan ditekan, bersama dengan nilai vkey yang ditentukan lokasi.sumber
PowerShell, 34 byte
Keluaran pada baris yang sama dengan input, yang dapat sedikit membingungkan.
sumber