检查键盘的所有键


14

编写等待标准101键美国键盘的每个键的最短程序 *的被按下,然后退出写入OK!

每次按下一个键时,程序都会在新行上显示需要按下的剩余未按下唯一键的数量,直到所有键至少被按下一次。该程序应该能够测试101键盘并查看每个键是否正常工作。因此,只要指定给用户,就允许按两次键或回车键。

两次或多次按下同一键既不会打扰代码,也不会更改剩余未按下键的显示数量。

所有按键(Left ShiftRight ShiftRight ControlEscEnter,等)应包括在内。

实际的键盘上的按键都在这个挑战的重要所以从程序的角度(Aa,是相同的,所以是6^)。

组合键不会被注册为组合命令,并且如果按下Ctrl+ Alt+,Del则仅会注册单个键,这将对所按下组合中的所有单个键进行计数。因此,如果您已经按了小写,则无需按大写字母,反之亦然。

数字小键盘上的数字键与程序的角度不同,因此,如果您使用的笔记本电脑或任何其他没有美国标准101键盘布局的键盘,则仍需要按数字键才能完成程序。你除非您插入兼容的键盘,否则无法完成挑战。

* 不支持具有Fn键和笔记本电脑键的键盘以使此挑战可行

这是美国标准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
是否可以要求每次按键后都按下Enter / Return键?如果没有,这在许多语言中都是不可能的。
门把手

5
请列出钥匙!
feersum

2
另外,程序是否必须支持不可打印的ASCII?(例如,Escape,Tab,Ctrl,Shift,Alt,Insert,箭头键,Caps Lock,Home,End,Page Up / Down,Backspace,Del,F键等)?是否必须同时按下字符及其转换版本?Ctrl +字符呢?小键盘键的计数与普通键不同吗?
门把手

1
@Doorknob除非笔记本电脑的键盘具有美国标准101键布局所需的全部101键,否则您无法使用笔记本电脑的键盘来应对挑战
Eduard Florinescu

1
@ beta-decay大多数解决此问题的人从未问过他们对它不了解的内容,因此我很难猜测。
Eduard Florinescu 2015年

Answers:


6

Javascript,524个字节

嗨,这是我在这里的第一篇文章,所以请问,如果我仍然对某些内容仍然一无所知,我想我还是会遵守规定的。

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

如果我不使用Chrome,这似乎有问题,但您可以在此处尝试。(请确保在关注示例窗口之前先打开控制台,因为阻止了F12的默认功能)

总览

该程序将所有101个“键码”组成一个数组。有些是显式编写的,有些序列带有for循环,有些则存储为字符串。我有一个单独的数组用于“双”键码,因为例如左右控件给出了相同的键码。但是,它们也提供了位置,因此我将键代码和位置组合为数组中的字符串。从那里开始,只有一个事件侦听器阻止默认的keydown功能(在这种情况下,不想使用F5刷新)和一个单独的keylist事件侦听器,因为可以在keydown上检测到每个单独的键,除了PRINTSCREEN。

在每个keyup事件之后,其余的键(也就是数组的长度)以及键码的名称都会被记录下来(因此左右移位之间是有区别的,等等)。我不确定这是否是必要条件,如果不是,您可以从分数中减去另外10个字节。

局限性

  • 它似乎只能在Chrome中正常运行

我希望这个答案能得到赞赏,如果做错任何事情,请告诉我。


5
欢迎来到PPCG!
FantaC

您可以将部分或全部分号更改为换行符吗?它不会帮助您增加字节数,但更容易阅读。
乔丹

这是一个更容易阅读的版本pastebin.com/PE4anSFw
M4Y

4

Java 8、607 + 64 = 671字节

这是一个lambda,它使用未使用的参数并抛出InterruptedException。它会启动一个窗口,当焦点对准时,它会拦截101个标准键的按下。字节数包括lambda和必需的导入。

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

您可以在此处找到带有非高尔夫版本的测试类。

总览

按下键时,唯一标识它们的值(大多数情况下为键代码)存储在一组中。三元分配的前几个级别,以c处理键码含糊不清的情况(例如“ Home”键,可能来自键盘的主要部分或数字键盘)以及同一键可以映射到多个键的情况按键代码(例如,数字键盘在打开或关闭Num Lock时的行为)。最终分支处理“普通”键,其键码可以简单地在集合中使用。密钥代码索引到位图中l,该位图指示密钥是否为标准101之一。

局限性

  • 该程序应该能够测试101键盘并查看每个键是否正常工作。

    如果按了除标准101以外的任何键,则可能会将堆栈跟踪打印为标准错误,否则可能会发生意外行为。

  • 该程序直接使用键码常量的数值,Oracle的KeyEvent文档表明这些值可能会随着时间而改变。

致谢

  • -10个字节感谢Kevin Cruijssen

2
f.setVisible(1>0);可以使用未使用的参数进行高尔夫球运动,f.show();()->可以进行高尔夫球运动。v->Void null
凯文·克鲁伊森

4

JavaScript的98 90 75字节

所以...我怀疑我可能在这里想不到的东西,但这应该可行。让我知道如果我已经忽略了什么。仅在Chrome中测试。

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

尝试一下

alert 为了您的理智而重写,并颠倒了顺序以保存滚动。

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>


您忽略的一件事是,当您按下非101键键盘上的键(例如Windows键)时,它也会倒计时。
M4Y

1
@ M4Y,我对挑战的解释是,我们假设使用的是指定的键盘,尤其是考虑到以下这一行:“ 如果您使用的笔记本电脑或任何其他键盘没有美国标准101键盘布局,则无法实现挑战,除非您插入兼容的键盘。
Shaggy

我想这很公平,聪明的解决方案!
M4Y
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.