Periksa semua tombol keyboard

14

Tulis program terpendek yang menunggu setiap tombol dari tombol Standard 101 US Keyboard * ditekan dan kemudian keluar dari tulisan OK!

Setiap kali tombol ditekan, program akan menampilkan pada baris baru jumlah tombol unik yang tidak ditekan yang perlu ditekan sampai semua tombol ditekan setidaknya satu kali. Program harus dapat menguji keyboard 101 dan melihat apakah setiap tombol berfungsi. Jadi, menekan dua kali tombol atau enter harus diizinkan selama ini ditentukan untuk pengguna.

Menekan tombol yang sama dua kali atau lebih tidak boleh mengacaukan kode atau mengubah jumlah tombol yang tersisa yang ditampilkan.

Semua tombol ( Left Shift, Right Shift, Right Control, Esc, Enter, dll) harus dimasukkan.

Tombol keyboard yang sebenarnya penting dalam tantangan ini sehingga dari perspektif program ( Adan a, adalah sama dan begitu juga 6dan ^).

Kunci kombinasi tidak akan didaftarkan sebagai perintah gabungan dan hanya kunci individual yang akan didaftarkan jika Ctrl+ Alt+ Delditekan yang akan menghitung semua kunci individu dalam kombinasi yang ditekan. Jadi tidak perlu menekan juga huruf kapital jika Anda sudah menekan huruf kecil dan sebaliknya.

Tombol angka pada keypad numerik berbeda dari perspektif program, sehingga tombol tersebut masih perlu ditekan untuk diselesaikan, jika Anda memiliki laptop atau keyboard lain yang tidak memiliki tata letak keyboard US Standard 101 Anda. tidak dapat memenuhi tantangan kecuali Anda memasang keyboard yang kompatibel.

* Keyboard yang memiliki kunci Fn dan kunci laptop tidak akan didukung untuk menjaga tantangan ini bisa dilakukan

Ini adalah daftar tombol untuk tata letak keyboard US Standard 101:

backspace
tab
enter
right shift
right ctrl
right alt
left shift
left ctrl
left alt
print screen
pause/break
caps lock
escape
page up
page down
end
home
left arrow
up arrow
right arrow
down arrow
insert
delete
0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
numpad 0
numpad 1
numpad 2
numpad 3
numpad 4
numpad 5
numpad 6
numpad 7
numpad 8
numpad 9
multiply
add
subtract
decimal point
numpad enter
divide
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12
num lock
scroll lock
semi-colon
equal sign
comma
dash
period
forward slash
grave accent
open bracket
back slash
close braket
single quote
space
Eduard Florinescu
sumber
1
Apakah saya tetap meminta tombol Enter / Return untuk ditekan setelah setiap kali tombol ditekan? Jika tidak, ini tidak mungkin dilakukan dalam banyak bahasa.
Gagang pintu
5
Daftar kuncinya!
feersum
2
Juga, apakah program harus mendukung ASCII yang tidak dapat dicetak? (mis. Escape, Tab, Ctrl, Shift, Alt, Insert, tombol panah, Caps Lock, Home, End, Page Up / Down, Backspace, Del, tombol F, dll)? Apakah karakter dan versi bergeser keduanya harus ditekan? Bagaimana dengan Ctrl + a character? Apakah kunci numpad berbeda dari yang biasa?
Gagang pintu
1
@Doorknob Anda tidak dapat memenuhi tantangan menggunakan keyboard laptop kecuali ia memiliki semua 101 kunci yang dibutuhkan oleh tata letak tombol Standard 101 AS
Eduard Florinescu
1
@ beta-decay Sebagian besar orang yang menutup pertanyaan ini tidak pernah bertanya apa yang tidak mereka mengerti sehingga sulit bagi saya untuk menebaknya.
Eduard Florinescu

Jawaban:

6

Javascript, 524 byte

Hai, ini adalah posting pertama saya di sini, jadi maafkan saya jika saya masih tidak tahu tentang beberapa hal, saya pikir saya tetap mengikuti aturan.

k=[8,9,"130","133","161","162","171","172","181","182",19,20,27,44,45,46,48,49,50,51,52,53,54,55,56,57,144,145,186,187,188,189,190,191,192,219,220,221,222];for(i=32;i<124;i+=1){i<41?k.push(i):i>64?i<91?k.push(i):i>95?i!=108?k.push(i):0:0:0}d=[13,16,17,18];m=document.addEventListener;c=console.log;m("keydown",e=>{e.preventDefault()});m("keyup",e=>{c(e.code);if(d.includes(e.which)){l=e.which+""+e.location;if(k.includes(l)){k.splice(k.indexOf(l),1)}}else if(k.includes(e.which)){k.splice(k.indexOf(e.which),1)}c(k.length)})

Tampaknya bermasalah jika saya tidak menggunakan Chrome, tetapi Anda dapat mencobanya di sini . (pastikan untuk membuka konsol sebelum Anda fokus pada jendela contoh, karena fungsi default F12 dicegah)

Gambaran

Program ini membuat larik semua 101 "kode kunci". Beberapa ditulis secara eksplisit, beberapa urutan ditambahkan dengan for for dan beberapa disimpan sebagai string. Saya memiliki array terpisah untuk kode kunci "ganda", karena kontrol kiri dan kanan misalnya memberikan kode kunci yang sama. Mereka juga memberikan lokasi, jadi saya menggabungkan kode kunci dengan lokasi sebagai string dalam array. Dari sana itu hanya eventlistener yang mencegah fungsionalitas keydown default (tidak ingin menyegarkan dengan F5 dalam kasus ini) dan eventlistener terpisah untuk keyup, karena setiap kunci tunggal dapat dideteksi pada keydown, KECUALI UNTUK PRINTSCREEN.

Setelah setiap kejadian keyup kunci yang tersisa (alias panjang array) akan dicatat, serta nama kode kunci (jadi ada perbedaan antara shift kiri dan kanan, dll). Saya tidak yakin apakah itu persyaratan, jika tidak, Anda dapat mengurangi 10 byte dari skor.

Keterbatasan

  • Tampaknya hanya berfungsi dengan baik di Chrome

Saya harap jawaban ini dihargai dan tolong beri tahu saya jika saya melakukan kesalahan.

M4Y
sumber
5
Selamat datang di PPCG!
FantaC
Bisakah Anda mengubah beberapa atau semua titik koma menjadi baris baru? Ini tidak akan membantu jumlah byte Anda, tetapi itu akan jauh lebih mudah dibaca.
Jordan
inilah versi yang jauh lebih mudah dibaca pastebin.com/PE4anSFw
M4Y
4

Java 8, 607 + 64 = 671 byte

Ini adalah lambda mengambil parameter yang tidak digunakan dan melempar InterruptedException. Ini meluncurkan jendela yang, ketika dalam fokus, memotong penekanan tombol standar 101. Hitungan Byte termasuk lambda dan impor yang diperlukan.

import java.awt.event.*;import javax.swing.*;import java.util.*;

v->{Set<Integer>s=new HashSet();long[]l={0x2bfff1ff081f0300l,0x8fffefff3ffffffel,3075<<16,4<<28|1};JFrame f=new JFrame();f.addKeyListener(new KeyAdapter(){public void keyReleased(KeyEvent e){int c=e.getKeyCode(),o=e.getKeyLocation(),n;c=(c==10|c>15&c<19)&o<3?-c:c==225?98:c==226?100:c==65386?101:c==227?102:c==224?104:o>3?c==33?105:c==34?99:c==35?97:c==36?103:c==127?110:c==155?96:c:(l[c/64]>>>c&1)<1?0:c;if(c!=0)s.add(c);System.out.println(n=101-s.size());if(n<1)synchronized(f){f.notify();}}});f.setFocusTraversalKeysEnabled(0<1);f.show();synchronized(f){f.wait();}System.out.print("OK!");System.exit(0);}

Anda dapat menemukan kelas tes dengan versi yang tidak diserang di sini .

Gambaran

Saat tombol ditekan, nilai yang mengidentifikasinya secara unik (dalam kebanyakan kasus, kode kunci) disimpan dalam satu set. Beberapa level pertama dari tugas ternary untuk cmenangani case di mana kode kuncinya ambigu (mis. Tombol "Home", yang bisa berasal dari bagian utama keyboard atau tombol angka) dan case di mana kunci yang sama dapat dipetakan ke beberapa kode kunci (mis. perilaku angka pad dengan Num Lock aktif atau nonaktif). Cabang terakhir menangani kunci "normal" yang kode kuncinya hanya dapat digunakan dalam set. Kode kunci diindeks ke dalam bitmap lyang menunjukkan apakah kunci tersebut adalah salah satu dari 101 standar.

Keterbatasan

  • Program harus dapat menguji keyboard 101 dan melihat apakah setiap tombol berfungsi.

    Jika tombol apa pun selain standar 101 ditekan, jejak tumpukan dapat dicetak ke kesalahan standar, atau perilaku yang tidak terduga dapat terjadi.

  • Program ini menggunakan nilai numerik dari konstanta kode kunci secara langsung, dan KeyEventdokumentasi Oracle menunjukkan bahwa nilai-nilai ini dapat berubah seiring waktu.

Ucapan Terima Kasih

  • -10 byte terima kasih kepada Kevin Cruijssen
Jakob
sumber
2
f.setVisible(1>0);dapat di-golf ke f.show();dan ()->bisa di-golf v->dengan menggunakan parameter yang tidak digunakanVoid null .
Kevin Cruijssen
4

JavaScript, 98 90 75 byte

Jadi ... Saya curiga saya mungkin memikirkan hal-hal di sini, tetapi ini harus bekerja. Biar saya tahu jika saya telah diabaikan apa-apa. Hanya diuji di Chrome.

s=new Set()
f=onkeydown=e=>!(onkeyup=e=>f(e,alert(101-s.add(e.code).size)))

Cobalah

alert diganti untuk kewarasan dan pesanan Anda terbalik untuk menyimpan gulir.

alert=x=>o.prepend(document.createTextNode(x+`\n`))
s=new Set()
f=onkeydown=e=>!(onkeyup=e=>f(e,alert(101-s.add(e.code).size)))
p{font-family:sans-serif;font-size:14px;}pre{margin:0 10px;}
<p>Focus here and start typing ...</p><pre id=o></pre>

Shaggy
sumber
Satu hal yang Anda abaikan adalah ia juga menghitung mundur ketika Anda menekan tombol yang tidak ada pada keyboard 101-kunci, seperti tombol windows.
M4Y
1
@ M4Y, interpretasi saya tentang tantangan adalah bahwa kami menganggap bahwa keyboard yang ditentukan adalah apa yang digunakan, terutama diberikan baris ini: " jika Anda memiliki laptop atau keyboard lain yang tidak memiliki tata letak keyboard US Standard 101 yang tidak dapat Anda penuhi tantangannya kecuali Anda memasang keyboard yang kompatibel. "
Shaggy
itu cukup adil kurasa, solusi pintar!
M4Y