A tarefa é escrever um código para identificar qual tecla é pressionada no teclado. Você pode assumir que apenas uma tecla é pressionada por vez e que existe um layout de teclado padrão nos EUA. Esse é o layout com o @ sobre o 2.
Seu código deve gerar um identificador exclusivo para qualquer tecla pressionada. Isso inclui PrtScn, Scroll Lock, Pause, Shift esquerdo, Shift direito, Ctrl esquerdo, Ctrl direito, Caps Lock, Tab, Enter, Enter no teclado numérico, Num Lock, Inserir, Ins no teclado numérico, Backspace, Del, F1 ... F12, Esc, tecla esquerda do Windows, tecla direita do Windows, Alt, AltGr, tecla do aplicativo (menu de contexto) e assim por diante.
Seu código deve continuar aguardando pressionamentos de teclas e exibindo sua identidade até que seja eliminado. No entanto, ele deve gerar o identificador assim que uma chave for liberada. Ele não deve executar nenhuma outra ação das teclas pressionadas que recebe e não deve produzir nada além do identificador exclusivo.
Na sua resposta, mostre o que você codifica para as seguintes teclas pressionadas: Tab, Pausar, Enter, Enter no teclado numérico, tecla Windows esquerda, tecla Windows direita, Inserir e Ins no teclado numérico.
Se você possui um teclado muito diferente, o desafio ainda é gerar um identificador diferente para cada tecla do teclado.
Respostas:
código de máquina x86, DOS executável,
29* 28 bytesEste é um executável COM para MS-DOS , requer um hardware compatível com IBM PC .
Particularmente um controlador 8042 PS / 2 ou, mais provavelmente, uma emulação dele através do SMM .
Para encurtar a história, deve funcionar imediatamente em qualquer PC convencional.
O código fonte é
Dividi o programa em duas partes.
A primeira parte trata da leitura dos scancodes . Scancodes são valores numéricos associados a cada chave.
Observe que estes são códigos de hardware, eles não dependem do sistema operacional ou do conjunto de caracteres. Eles são como um par codificado (coluna, linha) da chave.
Cada tecla possui um scancode, mesmo as teclas de função estranhas não padrão encontradas em algum teclado (por exemplo, a tecla "open calc").
Algumas chaves possuem scancode de vários bytes, possuem prefixos projetados para tornar o fluxo decodificável apenas olhando a sequência de bytes.
Assim, cada chave recebe seu identificador exclusivo, até CTRL, SHIFT, WinKeys e assim por diante.
Somente os "códigos de interrupção", enviados quando uma tecla é liberada, são processados, os "códigos de criação" são ignorados.
Os formadores têm o bit mais alto (bit 7 para um byte) definido, por isso é fácil reconhecê-los.
A segunda parte trata da impressão de um byte.
A impressão é sempre demorada na montagem, não temos componentes internos.
Para mantê-lo breve, e como era necessário escrever um identificador da chave, abandonei números decimais ou hexadecimais em favor de uma codificação pessoal.
Um byte xy, em que x é a mordidela mais alta e y, a mais baixa é impresso como dois caracteres sucessivos c 0 ec 1 definidos como:
c 0 = 0x21 + y
c 1 = 0x21 + x
Observe que a mordidela inferior é impressa primeiro (isso me poupou uma troca).
A lógica é mapear cada um dos 16 valores possíveis de uma mordidela em caracteres ASCII consecutivos de '!'.
Basta colocar este numeral hexadecimal, mas com
!"#$%&'()*+,-./01
como dígito (als) em vez de0123456789abcdef
Executá-lo no DOSBox e pressionar alguma tecla aleatória (parte da qual é uma tecla especial, mas observe que, como um processo do Windows, o DOSBox não pode capturar todas as chaves) produz
Observe que este programa nunca termina (além disso, ele assume o controle completo do PC desativando as interrupções), como eu acredito que foi pretendido pela pergunta (simplesmente não há eliminação de processos no DOS).
* Agradecimento reduzido a CodyGray .
fonte
IN
instrução foi menor em termos de bytes do que a interrupção da ROM BIOS (por exemploint 16h
, função 10h)?in
instrução. Na verdade, esse é um ponto muito bom. Se você ainda não o fez, por que não publicá-lo como resposta? :)xchg
o acumulador como um dos registros tem 1 byte, melhor do que um byte de 2 bytesmov
.int 16h
é que não recebo códigos de verificação para as teclas shift, bloqueio de rolagem ou pausa / pausa (talvez outras), e isso é exigido pelo desafio. Sua solução de ler a entrada diretamente da E / S funciona, embora pareça para mim que ela retorne o mesmo valor para todas as chaves no cluster Ins / Del / Home / End / PgUp / PgDown.Java 7 ou superior,
246228 bytesUngolfed:
-18 graças a @ OlivierGrégoire para
show()
,0<0
eimport java.awt.event.*;
O que resulta em:
Até lida com pressionamentos de tecla para caracteres maiúsculos, tecla do Windows, trava de tampa, etc. Você pode vê-lo também imprimindo os 'modificadores', que são 'teclas retidas'.
fonte
HTML (com Javascript),
4631 caracteres,4631 bytesUsando isso para diferenciar a entrada e o retorno do numpad, LControl e RControl ...Não mais desde que os apsillers encontraram uma maneira de fazer isso com uma chamada de função de sinalização.Saídas específicas:
SAÍDAS QUE AINDA ESTÃO COM OS NÚMEROS SÃO AQUELES QUE NÃO POSSO TESTAR NO MEU PORTÁTIL
POR FAVOR, AGUARDE-ME PARA ACESSAR ESSAS CHAVES
PrtScn -> PrintScreen
Lock Lock -> ScrollLock
Pause -> Pausar à
esquerda Shift -> ShiftLeft à
direita Shift -> ShiftRight à
esquerda Ctrl -> ContrlLeft à
direita Ctrl -> ControlRight
Caps Lock -> ControlRight Caps Lock ->
guia CapsLock -> guia
Enter -> Enter
Digite o número pad -> NumpadEntrar
Num Lock ->
Inserir NumLock -> Inserir
Ins no teclado numérico -> Numpad0
Backspace -> Backspace
Del -> Excluir
F1 ... F12 -> F1 a F12
Esc -> Escapar
tecla esquerda do Windows -> MetaLeft
direita Tecla do Windows -> MetaRight
Alt -> AltLeft
AltGr -> AltRight (tipo de buggy, ele detecta ControlLeft e depois AltRight,mas na verdade é AltRight)
chave do aplicativo (menu de contexto) -> ContextMenu
EDITs:
1 byte salvo
;
após a chamada da função18 bytes salvos graças aos Lil 'Bits e ETHproductions, eles notaram que eu esqueci de diminuir os nomes de func e var.
32 bytes salvos graças ao RogerSpielker, ele percebeu que eu estava fazendo código poupado sem motivo; e novamente -2 bytes:
onkeydown
->onkeyup
1 byte salvo: sem necessidade de barra final
2 bytes salvos graças ao CraigAyre:
with()
função2 bytes salvos graças ao ASCII-only:
key
no lugar dewhich
4 bytes salvos, já que temos texto, não há necessidade para
'-'+
(todo identificador é único sem isso) 1 byte salvo graças ao ASCII-only (novamente): não há mais símbolo de fechamento>
15 bytes salvos graças aos apsillers, como dito na parte superior da minha resposta.fonte
<body onkeydown=return!!alert(event.code)>
deve fazer o truque, retornandofalse
emkeydown
Tcl / Tk, 22 caracteres
Exemplo de execução:
Notas:
umdesignerinteligentecolocou o interruptor da luz de fundo em seu lugar)fonte
Bash com X.org, 21 bytes
Infelizmente, não posso testá-lo, pois estou no MacBook no Linux - sem PrntScr, sem teclado numérico e tudo.
xev
é uma ferramenta que gera eventos de mouse e teclado emX.org
. Eu o canalizo para awk, filtre as linhas pares (já que todas as teclas são mostradas quando a tecla é pressionada e, depois, liberada) e seleciono apenas as que contêm(k
- essa string está em todas as linhas que descrevem a tecla pressionada.fonte
showkey -s
lá: P) ou em uma área de trabalho pura da Wayland GUI. Esta é realmente uma resposta bash + Xorg.C e Win32,
240224216205202194191 bytesSaídas
TAB:
F0008C00F0008
PAUSE:
450012C0450012
ENTER:
1C000CC01C000C
NUMPAD-ENTER:
11C000CC11C000C
WINDOWS-LEFT:
15B005AC15B005A
WINDOWS-RIGHT:
15C005DC15C005D
INSERT:
152002CC152002C
NUMPAD-INSERT:
52002CC052002C
Explicação
Editar% s
-16 graças a @ugoren
-8: alterado
WNDCLASS
paraint
array, pois todos os 10 membros têm 4 bytes-11: inicialização parcial da matriz wndclass-data, reduzida para 9 elementos
-3: use
int
declínio implícito para a matriz wndclass-data-8: remove a nova linha do formato de saída (não é necessário nas especificações e nos printf liberados imediatamente sem ela); mover
RegisterClass
paraCreateWindow
arg, usando retornadoATOM
; defina o nome wndclass comom
qual apenas precisa de um byte zero para ser uma sequência válida.-3: reutilizar
w
var paraMSG
dadosfonte
<iostream>
+std::cout<<a^b<<"\n"
é mais longo. Além disso, acho que você precisaria adicionar tipos de retorno aos decls da função em
não poderia estar implícitoint
.for(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
p(x,y,a,b)
e(void*)p
deve salvar alguns.Java (OpenJDK 8) , 369 bytes
Isso não pode ser executado com o TIO porque ele usa uma interface gráfica, mas funciona no meu computador.
Ungolfed / Explicação:
fonte
setFocusTraversalKeysEnabled(false);
na sua resposta irá corrigir isso.Scala 2.10+, 279 caracteres, 279 bytes
Agora, essa é uma resposta do scala :) mesmo que pareça que estou fazendo Java. De qualquer forma, não podemos testá-lo no TIO.
É triste precisarmos declarar todos os métodos herdados, mesmo que não os utilizemos: Posso removê-los da contagem de bytes, pois alguns sinalizadores do compilador podem permitir não declará-los?
Isso imprime (como na minha resposta html-js) o keyPressed, "-" e, em seguida, seu "local".
Por exemplo :
PrtScn -> bloqueio de
rolagem não verificável -> 145-1
Pausa -> 19-1
Shift esquerdo -> 16-2
Shift direito -> 16-3
Ctrl esquerdo -> 17-2
Ctrl direito -> 17-3
Caps Lock -> 20-1
Guia -> não verificável
Digite -> 10-1
Digite no teclado numérico -> 10-4
Num Lock -> 144-4
Insira -> 96-1
Ins no teclado numérico -> 96-4
Backspace -> 8-1
Del -> 127-1
F1 ... F12 -> 112-1 a 123-1
Esc -> 27-1
tecla esquerda do Windows -> 524-2
tecla direita do Windows -> 524-3
Alt -> 18- 2
AltGr -> 18-3 (tipo de buggy, ele detecta 17-2 e depois 18-3,mas é de fato 18-3)
chave do aplicativo (menu de contexto) -> 525-1
Embora eu pense que depende do computador: / Eu estou em um laptop azerty agora.
fonte
-std=c89
já que os compiladores modernos assumem o padrão c99 ou c11, mas não precisam contar isso. Portanto, não tenho certeza de qual seria a decisão da meta de código-golfe.TI-BASIC, 19 bytes
Aqui está uma ilustração do restante das chaves:
Explicação:
Infelizmente, isso não é possível em Arnold C, então tive que me ater ao TI-BASIC.
fonte
C #, 144 + 601 = 745 bytes
Consiste em duas classes, não consegui combiná-las com êxito em uma classe.
Classe principal:
Classe de gancho:
Saídas:
137
147
141
142
220
221
174
224
fonte
||
para|
outros golfes semelhantes, mas meu cérebro precisa descansar depois de fazer isso!public int v;public int c;public int f;
poderia ser encurtado parapublic int v,c,f;
AutoHotkey , 26 bytes
Não é possível testar (somente vitória), mas a
M
opção dizPortanto, deve dar certo.
fonte
WinApi C ( gcc ), 156 bytes
Este programa imprime o código de chave virtual do Windows associado a cada tecla do teclado de entrada. O
\n
noprintf
formato de string é opcional (mas torna saída amigável humano) e pode ser caiu para uma pontuação total de 154 bytes . Uma maneira fácil de matar o programa (sem taskmgr) é comCTRL + PAUSE
. Se você possui um teclado com uma tecla Fn, este programa não pode ser capturado, pois nem é percebido pelo Windows.#include <d3d.h>
truque e inspiração para aBYTE
matriz.O programa com variáveis locais, legibilidade e sem avisos do compilador tem a seguinte aparência:
fonte
C (gcc) + Win32, 94
9598105107110bytesO código captura chaves mesmo depois que o foco é perdido.
As seguintes capturas de tela são registradas adicionando espaços entre as saídas (
printf("%d ",j);
+1 byte) para melhor legibilidade: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
O código usa
GetAsyncKeyState
para consultar o estado da chave sem verificar a fila de mensagens, geralmente mais em tempo real do que outras abordagens no modo de usuário (exceto DirectInput). Essa abordagem é amplamente usada em keyloggers.(j<16||j>18)
filtra Ctrl / Alt / Shift regulares. 16/17/18 é acionado sempre que o botão esquerdo ou direito é pressionado, juntamente com o valor de vkey especificado pelo local.fonte
PowerShell, 34 bytes
Saídas na mesma linha da entrada, o que pode ser um pouco confuso.
fonte