La tarea es escribir código para identificar qué tecla se presiona en el teclado. Puede suponer que solo se presiona una tecla a la vez y que hay un diseño de teclado estándar de EE. UU. Ese es el diseño con la @ sobre el 2.
Su código debe generar un identificador único para cualquier tecla presionada. Esto incluye PrtScn, Scroll Lock, Pause, left Shift, right Shift, left Ctrl, right Ctrl, Caps Lock, Tab, Enter, Enter en el teclado numérico, Bloq Num, Insertar, Ins en el teclado numérico, Retroceso, Supr, F1 ... F12, Esc, tecla izquierda de Windows, tecla derecha de Windows, Alt, AltGr, tecla de aplicación (menú contextual), etc.
Su código debe continuar esperando que se presionen las teclas y generando su identidad hasta que se elimine. Sin embargo, debe generar el identificador tan pronto como se suelte una clave. No debe realizar ninguna otra acción de las pulsaciones de teclas que recibe y no debe generar nada aparte del identificador único.
En su respuesta, muestre lo que codifica para las siguientes pulsaciones de teclas: Tabulador, Pausa, Intro, Intro en el teclado numérico, tecla izquierda de Windows, tecla derecha de Windows, Insertar e Ins en el teclado numérico.
Si tiene un teclado muy diferente, el desafío sigue siendo generar un identificador diferente para cada tecla de su teclado.
Respuestas:
código de máquina x86, ejecutable de DOS,
29* 28 bytesEste es un ejecutable COM para MS-DOS , requiere un hardware compatible con PC de IBM .
Particularmente un controlador 8042 PS / 2 o más probablemente una emulación del mismo través de SMM .
En pocas palabras, debería funcionar de forma inmediata en cualquier PC convencional.
El código fuente es
He dividido el programa en dos partes.
La primera parte trata de la lectura de los códigos de escaneo . Los códigos de escaneo son valores numéricos asociados con cada clave.
Tenga en cuenta que estos son códigos de hardware, no dependen del sistema operativo o del juego de caracteres. Son como un par codificado (columna, fila) de la clave.
Cada tecla tiene un código de escaneo, incluso aquellas teclas de función extrañas no estándar que se encuentran en algún teclado (por ejemplo, la tecla "abrir cálculo").
Algunas claves tienen un código de escaneo de varios bytes, tienen prefijos diseñados para hacer que la secuencia sea decodificable con solo mirar la secuencia de bytes.
Por lo tanto, cada tecla obtiene su identificador único, incluso CTRL, SHIFT, WinKeys, etc.
Solo se procesan los "códigos de interrupción", enviados cuando se suelta una tecla, se ignoran los "códigos de creación".
Los formadores tienen el conjunto de bits más alto (bit 7 para un byte), por lo que es fácil reconocerlos.
La segunda parte trata de la impresión de un byte.
La impresión siempre es larga en el ensamblaje, no tenemos incorporados.
Para que sea breve, y dado que era necesario escribir un identificador de la clave, abandoné los números decimales o hexadecimales a favor de una codificación personal.
Un byte xy, donde x es el mordisco más alto y y el más bajo se imprime como dos caracteres sucesivos c 0 y c 1 definidos como:
c 0 = 0x21 + y
c 1 = 0x21 + x
Tenga en cuenta que el mordisco inferior se imprime primero (esto me ahorró un intercambio).
La razón es mapear cada uno de los 16 valores posibles de un mordisco en caracteres ASCII consecutivos de '!'.
En pocas palabras, este es un número hexadecimal pero con
!"#$%&'()*+,-./01
como dígito (als) en lugar de0123456789abcdef
Ejecutarlo en DOSBox y presionar alguna tecla aleatoria (parte de la cual es una tecla especial, pero tenga en cuenta que, como proceso de Windows, DOSBox no puede capturar todas las teclas) produce
Tenga en cuenta que este programa nunca termina (además, toma el control completo de la PC al deshabilitar las interrupciones) como creo que fue la intención (simplemente no hay eliminación de procesos en DOS).
* Reducido gracias a CodyGray .
fuente
IN
instrucción resultó ser más pequeño en términos de bytes que llamar a las interrupciones del BIOS ROM (por ejemploint 16h
, la función 10h)?in
instrucciones. Ese es realmente un muy buen punto que tienes. Si aún no lo ha hecho, ¿por qué no publicarlo como respuesta? :)xchg
con el acumulador como uno de los registros es de 1 byte, es mejor que un byte de 2mov
.int 16h
es que no obtengo códigos de escaneo para las teclas de mayúsculas, bloqueo de desplazamiento o pausa / pausa (tal vez otros), y eso es requerido por el desafío. Su solución de leer la entrada directamente desde la E / S funciona, aunque me parece que devuelve el mismo valor para todas las teclas en el clúster Ins / Del / Home / End / PgUp / PgDown.Java 7 o superior,
246228 bytesSin golf:
-18 gracias a @ OlivierGrégoire por
show()
,0<0
yimport java.awt.event.*;
Lo que resulta en:
Incluso maneja las pulsaciones de mayúsculas para los caracteres en mayúscula, la tecla de Windows, los bloqueos de mayúsculas, etc. También puede verlo imprimiendo los 'modificadores', que son 'teclas retenidas'.
fuente
HTML (con Javascript),
4631 caracteres,4631 bytesUtilizando esto para diferenciar el teclado numérico enter y return, LControl y RControl ...Ya no, ya que los apsillers encontraron una manera de hacerlo con una llamada de función de señal.Salidas específicas:
LOS PRODUCTOS QUE TODAVÍA ESTÁN CON LOS NÚMEROS SON LOS QUE NO PUEDO PROBAR EN MI COMPUTADORA PORTÁTIL
POR FAVOR ESPERE QUE TENGO ACCESO A ESAS TECLAS
PrtScn -> PrintScreen
Scroll Lock -> ScrollLock
Pause -> Pause
left Shift -> ShiftLeft
right Shift -> ShiftRight
left Ctrl -> ContrlLeft
right Ctrl -> ControlRight
Caps Lock -> TabLock
Tab -> Tab
Enter -> Enter
Enter en el número pad -> Numpad Ingrese
Num Lock -> NumLock
Insert -> Insert
Ins en el teclado numérico -> Numpad0
Retroceso -> Retroceso
Supr -> Eliminar
F1 ... F12 -> F1 a F12
Esc -> Escape
izquierda Tecla de Windows -> MetaLeft
derecha Tecla de Windows -> MetaRight
Alt -> AltLeft
AltGr -> AltRight (tipo de error, detecta ControlLeft y luego AltRight,pero de hecho es AltRight)
aplicación (menú contextual) -> ContextMenu
EDITOS:
1 byte guardado
;
después de la llamada de func18 bytes guardados gracias a Lil 'Bits y ETHproductions, notaron que olvidé acortar los nombres de func y var.
32 bytes guardados gracias a RogerSpielker, notó que estaba haciendo código espaciado sin ninguna razón; y nuevamente -2 bytes:
onkeydown
->onkeyup
1 byte guardado: no es necesario para la barra final
2 bytes guardados gracias a CraigAyre:
with()
función2 bytes guardados gracias a ASCII-only:
key
en lugar dewhich
4 bytes guardados, ya que tenemos texto, no hay necesidad for
'-'+
(cada identificador es único sin esto) 1 byte guardado gracias a ASCII-only (nuevamente): no más símbolo de cierre>
15 bytes guardados gracias a apsillers, como se dice en la parte superior de mi respuesta.fuente
<body onkeydown=return!!alert(event.code)>
debería hacer el truco volviendofalse
sobrekeydown
Tcl / Tk, 22 caracteres
Ejecución de muestra:
Notas:
inteligentepuso el interruptor de luz de fondo en su lugar)fuente
Bash con X.org, 21 bytes
Desafortunadamente, no puedo probarlo ya que estoy en MacBook en Linux: sin PrntScr, sin teclado numérico y todo.
xev
es una herramienta que genera eventos de mouse y teclado enX.org
. Lo canalizo a awk, filtro líneas pares (ya que cada tecla se muestra cuando se presiona la tecla, y luego cuando se suelta), y selecciono solo las que contienen(k
: esta cadena se encuentra en cada línea que describe la tecla presionada.fuente
showkey -s
allí: P), o en un escritorio de GUI de Wayland puro. Esta es realmente una respuesta bash + Xorg.C y Win32,
240224216205202194191 bytesSalidas
TAB:
F0008C00F0008
PAUSE:
450012C0450012
ENTER:
1C000CC01C000C
NUMPAD-ENTER:
11C000CC11C000C
WINDOWS-LEFT:
15B005AC15B005A
WINDOWS-RIGHT:
15C005DC15C005D
INSERT:
152002CC152002C
NUMPAD-INSERT:
52002CC052002C
Explicación
Ediciones
-16 gracias a @ugoren
-8: cambiado
WNDCLASS
aint
matriz ya que los 10 miembros son 4 bytes-11: inicialización parcial de la matriz de datos wndclass, reducida a 9 elementos
-3: utiliza
int
declinación implícita para la matriz de datos wndclass-8: eliminar la nueva línea del formato de salida (no se requiere en la especificación y printf se vacía inmediatamente sin ella); pasar
RegisterClass
aCreateWindow
arg, usando returnATOM
; establecer wndclass name enm
que solo necesita un byte cero para que sea una cadena válida.-3: reutilizar
w
var paraMSG
datosfuente
<iostream>
+std::cout<<a^b<<"\n"
es más largo. Además, creo que necesitaría agregar tipos de retorno a la función decls, ym
no podría ser implícitoint
.for(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
p(x,y,a,b)
y(void*)p
debería guardar algunos.Java (OpenJDK 8) , 369 bytes
Esto no se puede ejecutar con TIO porque usa una interfaz gráfica, pero funciona en mi computadora.
Sin golf / Explicación:
fuente
setFocusTraversalKeysEnabled(false);
en su respuesta arreglará esto.Scala 2.10+, 279 caracteres, 279 bytes
Ahora, esta es una respuesta de escala :) aunque parece que estoy haciendo Java. De todos modos, no podemos probarlo en TIO.
Es triste que necesitemos declarar todos los métodos heredados incluso si no los usamos: ¿Puedo eliminarlos del recuento de bytes, ya que algunos indicadores del compilador pueden permitir no declararlos?
Esto imprime (en cuanto a mi respuesta html-js) la tecla presionada, "-" y luego su "ubicación".
Por ejemplo :
PrtScn -> Bloqueo de
desplazamiento no verificable -> 145-1
Pausa -> 19-1
izquierda Shift -> 16-2
derecha Shift -> 16-3
izquierda Ctrl -> 17-2
derecha Ctrl -> 17-3
Bloq Mayús -> 20-1
Pestaña -> no verificable
Ingresar -> 10-1
Ingresar en el teclado numérico -> 10-4
Bloqueo numérico -> 144-4
Insertar -> 96-1
Ins en el teclado numérico -> 96-4
Retroceso -> 8-1
Supr -> 127-1
F1 ... F12 -> 112-1 a 123-1
Esc -> 27-1
tecla de Windows izquierda -> 524-2
tecla de Windows derecha -> 524-3
Alt -> 18- 2
AltGr -> 18-3 (tipo de buggy, detecta 17-2 y luego 18-3,pero de hecho es 18-3)
clave de aplicación (menú contextual) -> 525-1
Aunque creo que depende de la computadora: / Estoy en una computadora portátil azerty en este momento.
fuente
-std=c89
ya que los compiladores modernos tienen por defecto el valor c99 o c11, pero no necesitan contar eso. Por lo tanto, no estoy seguro de cuál sería el fallo del código golf meta.TI-BASIC, 19 bytes
Aquí hay una ilustración del resto de las teclas:
Explicación:
Esto, desafortunadamente, no es posible en Arnold C, así que tuve que apegarme a TI-BASIC.
fuente
C #, 144 + 601 = 745 bytes
Consiste en dos clases, no pude combinarlas con éxito en una sola clase.
Clase principal:
Clase de gancho:
Salidas:
137
147
141
142
220
221
174
224
fuente
||
a|
y otros campos de golf similares, ¡pero mi cerebro necesita descansar después de hacer eso!public int v;public int c;public int f;
podría acortarse apublic int v,c,f;
AutoHotkey , 26 bytes
No se puede probar (solo ganar), pero la
M
opción diceEntonces debería hacerlo bien.
fuente
WinApi C ( gcc ), 156 bytes
Este programa imprime el código de clave virtual de Windows asignado con cada tecla de entrada de teclado. El
\n
en laprintf
cadena de formato es opcional (pero hace que la salida sea amigable para los humanos) y puede descartarse para una puntuación total de 154 bytes . Una manera fácil de matar el programa (sin taskmgr) es conCTRL + PAUSE
. Si tiene un teclado con una tecla Fn, este programa no puede recuperarlo, ya que Windows ni siquiera lo nota.#include <d3d.h>
truco e inspiración para laBYTE
matriz.El programa con variables locales, legibilidad y sin advertencias del compilador se ve así:
fuente
C (gcc) + Win32, 94
9598105107110bytesEl código captura claves incluso después de perder el foco.
Las siguientes capturas de pantalla se graban agregando espacios entre salidas (
printf("%d ",j);
+1 byte) para una mejor lectura: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
El código se usa
GetAsyncKeyState
para consultar el estado de la clave sin verificar la cola de mensajes, generalmente más en tiempo real que otros enfoques de modo de usuario (excepto DirectInput). Este enfoque es ampliamente utilizado en keyloggers.(j<16||j>18)
filtra Ctrl / Alt / Shift regular. 16/17/18 se activa cada vez que se presiona el botón izquierdo o derecho, junto con el valor de la tecla v especificado por la ubicación.fuente
PowerShell, 34 bytes
Salidas en la misma línea que la entrada, lo que puede ser un poco confuso.
fuente