Verifica todas las teclas de un teclado

14

Escriba el programa más corto que espere a que se presione cada tecla de un teclado estándar de EE. UU. * Y luego salga de la escritura.

Cada vez que se presiona una tecla, el programa muestra en una nueva línea el número restante de teclas únicas no presionadas que deben presionarse hasta que se presionen todas las teclas al menos una vez. El programa debería poder probar un teclado 101 y ver si cada tecla funciona. Por lo tanto, se permite presionar dos veces una tecla o enter siempre que esto se especifique al usuario.

Presionar la misma tecla dos veces o más no debe interrumpir el código ni cambiar el número de teclas restantes sin presionar.

Todas las teclas ( Left Shift, Right Shift, Right Control, Esc, Enter, etc.) deben ser incluidos.

Las teclas del teclado son importantes en este desafío, por lo que desde la perspectiva del programa ( Ay a, son las mismas y también lo son 6y ^).

Las teclas combinadas no se registrarán como un comando combinado y solo se registrarán las teclas individuales si se presiona Ctrl+ Alt+ Delque contará para todas las teclas individuales en la combinación que se está presionando. Por lo tanto, no es necesario presionar también las mayúsculas si ya presionó las minúsculas y viceversa.

Teclas numéricas en el teclado numérico son diferentes desde el punto de vista del programa, por lo que todavía se necesitan para ser presionado para que el programa termine, si usted tiene una computadora portátil o cualquier otro teclado que no tiene el 101 teclado estándar de EE.UU. Disposición del que no puede cumplir el desafío a menos que conecte un teclado compatible.

* Los teclados con tecla Fn y tecla portátil no serán compatibles para mantener este desafío factible

Esta es la lista de teclas para una distribución de teclado 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
fuente
1
¿Está bien exigir que se presione la tecla Enter / Return después de cada pulsación de tecla? Si no, esto es imposible en muchos idiomas.
Pomo de la puerta
55
Lista de llaves por favor!
feersum
2
Además, ¿el programa debe admitir ASCII no imprimible? (ej. Escape, Tab, Ctrl, Shift, Alt, Insertar, las teclas de flecha, Bloq Mayús, Inicio, Fin, Retroceder página, Retroceso, Supr, las teclas F, etc.)? ¿Hay que presionar un personaje y su versión modificada? ¿Qué pasa con Ctrl + un personaje? ¿Las teclas del teclado numérico cuentan de manera diferente a las teclas normales?
Pomo de la puerta
1
@Doorknob No puede cumplir el desafío con el teclado de una computadora portátil a menos que tenga las 101 teclas necesarias para el diseño de las teclas estándar de EE. UU. 101
Eduard Florinescu
1
@ beta-decay La mayoría de las personas que cerraron esta pregunta nunca preguntaron qué no entienden, por lo que es difícil para mí adivinar.
Eduard Florinescu

Respuestas:

6

Javascript, 524 bytes

Hola, esta es mi primera publicación aquí, así que discúlpeme si todavía soy ignorante en algunas cosas, creo que me mantuve dentro de las reglas.

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

Parece defectuoso si no uso Chrome, pero puedes probarlo aquí . (asegúrese de abrir la consola antes de centrarse en la ventana de ejemplo, ya que se evita la funcionalidad predeterminada de F12)

Visión general

El programa crea una matriz de todos los 101 "códigos clave". Algunas se escriben explícitamente, algunas secuencias se agregan con un bucle for y otras se almacenan como cadenas. Tengo una matriz separada para los códigos de teclas "dobles", ya que el control izquierdo y derecho, por ejemplo, proporciona el mismo código clave. Sin embargo, también proporcionan una ubicación, por lo que combino los códigos clave con las ubicaciones como cadenas en la matriz. A partir de ahí, solo se trata de un detector de eventos que impide la funcionalidad de teclas predeterminadas (no quiera actualizar con F5 en este caso) y un detector de eventos separado para la activación de teclas, porque cada tecla se puede detectar al presionar la tecla, EXCEPTO PARA PANTALLA DE IMPRESIÓN.

Después de cada evento de keyup, se registran las claves restantes (es decir, la longitud de la matriz), así como el nombre del código clave (por lo que existe la distinción entre desplazamiento a la izquierda y derecha, etc.). No estaba seguro de si eso era un requisito, si no, puede restar otros 10 bytes de la puntuación.

Limitaciones

  • Solo parece funcionar bien en Chrome

Espero que esta respuesta sea apreciada y por favor avíseme si he hecho algo mal.

M4Y
fuente
55
Bienvenido a PPCG!
FantaC
¿Puedes cambiar algunos o todos los puntos y comas a líneas nuevas? No ayudará a su recuento de bytes, pero sería mucho más fácil de leer.
Jordan
aquí hay una versión que es mucho más fácil de leer pastebin.com/PE4anSFw
M4Y
4

Java 8, 607 + 64 = 671 bytes

Esta es una lambda que toma un parámetro no utilizado y lo lanza InterruptedException. Lanza una ventana que, cuando está enfocada, intercepta las pulsaciones de las 101 teclas estándar. El conteo de bytes incluye lambda y las importaciones requeridas.

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

Puede encontrar una clase de prueba con una versión sin golf aquí .

Visión general

A medida que se presionan las teclas, los valores que los identifican de forma exclusiva (en la mayoría de los casos, el código de la tecla) se almacenan en un conjunto. Los primeros niveles de la asignación ternaria para cmanejar casos en los que el código de la tecla es ambiguo (por ejemplo, la tecla "Inicio", que podría provenir de la parte principal del teclado o el teclado numérico) y los casos en que la misma tecla se puede asignar a múltiples códigos clave (por ejemplo, comportamiento del teclado numérico con Num Lock activado o desactivado). La rama final maneja las claves "normales" cuyo código de clave simplemente se puede utilizar en el conjunto. El código de clave se indexa en el mapa de bits lque indica si la clave es una de las 101 estándar.

Limitaciones

  • El programa debería poder probar un teclado 101 y ver si cada tecla funciona.

    Si se presiona cualquier tecla que no sea el estándar 101, se puede imprimir un seguimiento de la pila con un error estándar, o puede ocurrir un comportamiento inesperado.

  • El programa utiliza los valores numéricos de las constantes del código clave directamente, y la KeyEventdocumentación de Oracle indica que estos valores pueden cambiar con el tiempo.

Expresiones de gratitud

  • -10 bytes gracias a Kevin Cruijssen
Jakob
fuente
2
f.setVisible(1>0);se puede jugar golf f.show();y ()->golf v->usando un Void nullparámetro no utilizado .
Kevin Cruijssen
4

JavaScript, 98 90 75 bytes

Entonces ... sospecho que podría estar pensando menos en las cosas aquí, pero esto debería funcionar. Déjame saber si yo he pasado por alto nada. Solo probado en Chrome.

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

Intentalo

alert anulado por su cordura y orden invertido para guardar el desplazamiento.

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>

Lanudo
fuente
Una cosa que pasó por alto es que también cuenta hacia atrás cuando presiona teclas que no están en el teclado de 101 teclas, como las teclas de Windows.
M4Y
1
@ M4Y, mi interpretación del desafío fue que asumimos que el teclado especificado es lo que se está utilizando, especialmente dada esta línea: " si tiene una computadora portátil o cualquier otro teclado que no tiene la distribución de teclado estándar estadounidense 101 no puede cumplir el desafío a menos que conecte un teclado compatible " .
Shaggy
eso es bastante justo, supongo, ¡solución inteligente!
M4Y