Kiểm tra tất cả các phím của bàn phím


14

Viết chương trình ngắn nhất chờ mọi phím của Bàn phím US 101 tiêu chuẩn * được nhấn và sau đó thoát khỏi văn bản OK!

Mỗi lần nhấn phím, chương trình sẽ hiển thị trên một dòng mới, số phím duy nhất chưa được nhấn còn lại cần được nhấn cho đến khi tất cả các phím được nhấn ít nhất một lần. Chương trình sẽ có thể kiểm tra bàn phím 101 và xem mọi phím có hoạt động không. Vì vậy, nhấn hai lần một phím hoặc nhập sẽ được cho phép miễn là điều này được chỉ định cho người dùng.

Nhấn cùng một phím hai lần trở lên sẽ không làm gián đoạn mã cũng như thay đổi số lượng phím chưa được hiển thị còn lại.

Tất cả các phím ( Left Shift, Right Shift, Right Control, Esc, Enter, vv) nên được bao gồm.

Các phím bàn phím thực tế rất quan trọng trong thử thách này vì vậy theo quan điểm của chương trình ( Aa, giống nhau và cũng vậy 6^).

Các khóa kết hợp sẽ không được đăng ký dưới dạng lệnh kết hợp và chỉ các phím riêng lẻ sẽ được đăng ký nếu nhấn Ctrl+ Alt+ Delsẽ tính cho tất cả các phím riêng lẻ trong tổ hợp được nhấn. Vì vậy, không cần phải nhấn cả chữ in hoa nếu bạn đã nhấn chữ thường và ngược lại.

Các phím số trên bàn phím số khác với phối cảnh của chương trình, do đó chúng vẫn cần được nhấn để chương trình kết thúc, nếu bạn có máy tính xách tay hoặc bất kỳ bàn phím nào khác không có bố cục bàn phím US Standard 101 cho bạn không thể hoàn thành thử thách trừ khi bạn bổ sung bàn phím tương thích.

* Bàn phím có phím Fn và phím máy tính xách tay sẽ không được hỗ trợ để duy trì thử thách này

Đây là danh sách các phím để bố trí bàn phím 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

1
Có thể yêu cầu nhấn phím Enter / Return sau mỗi lần nhấn phím không? Nếu không, điều này là không thể trong nhiều ngôn ngữ.
Doorknob

5
Danh sách các phím xin vui lòng!
frageum

2
Ngoài ra, chương trình có phải hỗ trợ không thể in-ASCII không? (ví dụ Escape, Tab, Ctrl, Shift, Alt, Chèn, các phím mũi tên, Caps Lock, Home, End, Page Up / Down, Backspace, Del, các phím F, v.v.)? Làm một nhân vật và phiên bản thay đổi của cả hai phải được nhấn? Còn Ctrl + một ký tự thì sao? Các phím numpad có khác nhau so với các phím thông thường không?
Doorknob

1
@Doorknob Bạn không thể thực hiện thử thách bằng bàn phím của máy tính xách tay trừ khi nó có tất cả 101 phím cần thiết theo cách bố trí phím 101 tiêu chuẩn của Hoa Kỳ
Eduard Florinescu

1
@ beta-decay Hầu hết những người đóng câu hỏi này không bao giờ hỏi những gì họ không hiểu từ đó nên tôi rất khó đoán.
Eduard Florinescu

Câu trả lời:


6

Javascript, 524 byte

Xin chào, đây là bài viết đầu tiên của tôi ở đây, vì vậy xin lỗi nếu tôi vẫn không biết gì về một số thứ, tôi nghĩ rằng tôi vẫn ở trong các quy tắc mặc dù.

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)})

Có vẻ như lỗi nếu tôi không sử dụng Chrome, nhưng bạn có thể dùng thử tại đây . (hãy chắc chắn mở bàn điều khiển trước khi bạn tập trung vào cửa sổ ví dụ, vì chức năng mặc định của F12 bị ngăn chặn)

Tổng quat

Chương trình tạo ra một mảng gồm tất cả 101 "mã khóa". Một số được viết rõ ràng, một số chuỗi được thêm vào bằng một vòng lặp for và một số được lưu trữ dưới dạng chuỗi. Tôi có một mảng riêng biệt cho các mã khóa "kép", vì ví dụ điều khiển bên trái và bên phải cho cùng một mã khóa. Tuy nhiên, họ cũng đưa ra một vị trí, vì vậy tôi kết hợp các mã phím với các vị trí dưới dạng các chuỗi trong mảng. Từ đó, nó chỉ là một trình tạo sự kiện ngăn chức năng tắt phím mặc định (không muốn làm mới với F5 trong trường hợp này) và một trình liệt kê sự kiện riêng biệt cho keyup, bởi vì mọi phím đơn có thể được phát hiện khi tắt phím, NGOẠI TRỪ ĐỂ IN.

Sau mỗi sự kiện keyup, các khóa còn lại (còn gọi là độ dài của mảng) được ghi lại, cũng như tên của mã khóa (do đó có sự phân biệt giữa dịch chuyển trái và phải, v.v.). Tôi không chắc đó có phải là một yêu cầu không, nếu không bạn có thể trừ thêm 10 byte khỏi điểm số.

Hạn chế

  • Nó dường như chỉ hoạt động tốt trong Chrome

Tôi hy vọng câu trả lời này được đánh giá cao và xin vui lòng cho tôi biết nếu tôi đã làm gì sai.


5
Chào mừng đến với PPCG!
FantaC

Bạn có thể thay đổi một số hoặc tất cả các dấu chấm phẩy thành dòng mới không? Nó sẽ không giúp đếm byte của bạn nhưng nó sẽ dễ đọc hơn nhiều.
Jordan

đây là phiên bản dễ đọc hơn pastebin.com/PE4anSFw
M4Y

4

Java 8, 607 + 64 = 671 byte

Đây là một lambda lấy một tham số không sử dụng và ném InterruptedException. Nó khởi chạy một cửa sổ, khi tập trung, chặn các phím bấm của 101 phím tiêu chuẩn. Số lượng byte bao gồm lambda và nhập khẩu bắt buộc.

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);}

Bạn có thể tìm thấy một lớp kiểm tra với một phiên bản chưa được chỉnh sửa ở đây .

Tổng quat

Khi các phím được nhấn, các giá trị xác định duy nhất chúng (trong hầu hết các trường hợp, mã khóa) được lưu trữ trong một bộ. Một vài cấp độ đầu tiên của phép gán ternary để cxử lý các trường hợp mã khóa không rõ ràng (ví dụ: phím "Home", có thể đến từ phần chính của bàn phím hoặc bàn phím số) và các trường hợp trong đó cùng một khóa có thể ánh xạ tới nhiều mã khóa (ví dụ: hành vi phím số với bật hoặc tắt Num Lock). Nhánh cuối cùng xử lý các khóa "bình thường" có mã khóa có thể được sử dụng đơn giản trong tập hợp. Mã khóa lập chỉ mục vào bitmap lcho biết khóa có phải là một trong 101 tiêu chuẩn hay không.

Hạn chế

  • Chương trình sẽ có thể kiểm tra bàn phím 101 và xem mọi phím có hoạt động không.

    Nếu bất kỳ phím nào ngoài 101 tiêu chuẩn được nhấn, dấu vết ngăn xếp có thể được in thành lỗi tiêu chuẩn hoặc hành vi không mong muốn có thể xảy ra.

  • Chương trình sử dụng trực tiếp các giá trị số của các hằng số mã khóa và KeyEventtài liệu của Oracle chỉ ra rằng các giá trị này có thể thay đổi theo thời gian.

Sự nhìn nhận

  • -10 byte nhờ Kevin Cruijssen

2
f.setVisible(1>0);có thể được đánh gôn f.show();()->có thể được đánh golf v->bằng cách sử dụng một Void nulltham số không sử dụng .
Kevin Cruijssen

4

JavaScript, 98 90 75 byte

Vì vậy, ... tôi nghi ngờ tôi có thể đánh giá thấp mọi thứ ở đây nhưng điều này sẽ hoạt động. Hãy cho tôi biết nếu tôi đã bỏ qua bất cứ điều gì. Chỉ được thử nghiệm trong Chrome.

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

Thử nó

alert ghi đè cho sự tỉnh táo của bạn và trật tự đảo ngược để lưu cuộn.

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>


Một điều bạn bỏ qua là nó cũng đếm ngược khi bạn nhấn các phím không có trên bàn phím 101, như các phím windows.
M4Y

1
@ M4Y, cách giải thích của tôi về thách thức là chúng tôi giả định rằng bàn phím được chỉ định là thứ đang được sử dụng, đặc biệt là với dòng này: " nếu bạn có máy tính xách tay hoặc bất kỳ bàn phím nào khác không có bố cục bàn phím US Standard 101, bạn không thể đáp ứng thách thức trừ khi bạn bổ sung một bàn phím tương thích. "
Shaggy

đủ công bằng tôi cho rằng, giải pháp thông minh!
M4Y
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.