Verifique todas as teclas de um teclado

14

Escreva o programa mais curto que aguarde até que todas as teclas de um teclado americano com 101 teclas padrão * sejam pressionadas e saia da escrita OK!

Cada vez que uma tecla é pressionada, o programa exibe em uma nova linha o número restante de teclas exclusivas não pressionadas que precisam ser pressionadas até que todas as teclas sejam pressionadas pelo menos uma vez. O programa deve poder testar um teclado 101 e verificar se todas as teclas funcionam. Portanto, pressionar duas vezes uma tecla ou enter deve ser permitido, desde que isso seja especificado para o usuário.

Pressionar a mesma tecla duas ou mais vezes não deve interromper o código nem alterar o número exibido de teclas não pressionadas exibidas.

Todas as teclas ( Left Shift, Right Shift, Right Control, Esc, Enter, etc.) devem ser incluídos.

As teclas do teclado reais são importantes neste desafio de modo a partir da perspectiva do programa ( Ae a, são os mesmos e por isso são 6e ^).

As teclas combinadas não serão registradas como um comando combinado e somente as teclas individuais serão registradas se Ctrl+ Alt+ Delfor pressionado, o que contará para todas as teclas individuais da combinação sendo pressionada. Portanto, não é necessário pressionar também as letras maiúsculas se você já pressionou as letras minúsculas e vice-versa.

As teclas numéricas no teclado numérico são diferentes da perspectiva do programa; portanto, ainda é necessário pressionar a tecla para que o programa termine, se você tiver um laptop ou qualquer outro teclado que não possua o layout de teclado US Standard 101 . não pode cumprir o desafio, a menos que você conecte um teclado compatível.

* Os teclados com as teclas Fn e laptop não serão suportados para manter esse desafio possível

Esta é a lista de teclas para um layout de teclado do 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
fonte
1
É permitido exigir que a tecla Enter / Return seja pressionada após cada pressionamento de tecla? Caso contrário, isso é impossível em muitos idiomas.
Maçaneta
5
Lista de chaves, por favor!
feersum
2
Além disso, o programa precisa oferecer suporte a ASCII não imprimível? (ex. Escape, Tab, Ctrl, Shift, Alt, Insert, as teclas de seta, Caps Lock, Home, End, Page Up / Down, Backspace, Del, as teclas F, etc.)? Um personagem e sua versão alterada precisam ser pressionados? E o Ctrl + um caractere? As teclas numpad contam de maneira diferente das teclas normais?
Maçaneta
1
@Doorknob Você não pode cumprir o desafio usando o teclado de um computador portátil a menos que tenha todos os 101 chaves necessárias pelo Padrão US layout de 101 teclas
Eduard Florinescu
1
@ decaimento beta A maioria das pessoas que encerraram esta pergunta nunca perguntou o que não entendem, por isso é difícil de adivinhar.
Eduard Florinescu

Respostas:

6

Javascript, 524 bytes

Olá, este é o meu primeiro post aqui, desculpe-me se ainda sou ignorante em algumas coisas, acho que fiquei dentro das regras.

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 incorreto se eu não usar o Chrome, mas você pode experimentá-lo aqui . (abra o console antes de focar na janela de exemplo, pois a funcionalidade padrão do F12 é impedida)

Visão geral

O programa cria uma matriz de todos os 101 "códigos-chave". Alguns são escritos explicitamente, algumas sequências são adicionadas com um loop for e outras são armazenadas como strings. Eu tenho uma matriz separada para os códigos de tecla "duplos", pois o controle esquerdo e direito, por exemplo, fornece o mesmo código de chave. No entanto, eles também fornecem um local, então eu combino os códigos-chave com os locais como cadeias de caracteres na matriz. A partir daí, é apenas um listener de eventos que impede a funcionalidade padrão de pressionamento de tecla (nesse caso, não é necessário atualizar com F5) e um listener de eventos separado para keyup, porque todas as chaves podem ser detectadas no pressionamento de tecla, EXCETO PARA IMPRESSORA.

Após cada evento de keyup, as chaves restantes (também conhecidas como o comprimento da matriz) são registradas, bem como o nome do código da chave (para que haja a distinção entre turno esquerdo e direito, etc). Eu não tinha certeza se isso era um requisito; caso contrário, você pode subtrair outros 10 bytes da pontuação.

Limitações

  • Parece apenas funcionar bem no Chrome

Espero que esta resposta seja apreciada e informe-me se fiz algo errado.

M4Y
fonte
5
Bem-vindo ao PPCG!
FantaC 23/01
Você pode alterar alguns ou todos os pontos e vírgulas para novas linhas? Não ajudará na contagem de bytes, mas seria muito mais fácil de ler.
Jordânia
aqui está uma versão muito mais fácil de ler pastebin.com/PE4anSFw
M4Y
4

Java 8, 607 + 64 = 671 bytes

Este é um lambda que pega um parâmetro não utilizado e lança InterruptedException. Ele abre uma janela que, quando em foco, intercepta o pressionamento das 101 teclas padrão. A contagem de bytes inclui lambda e importações necessárias.

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

Você pode encontrar uma classe de teste com uma versão não destruída aqui .

Visão geral

À medida que as teclas são pressionadas, os valores que as identificam exclusivamente (na maioria dos casos, o código da tecla) são armazenados em um conjunto. Os primeiros níveis da atribuição ternária para clidar com casos em que o código da tecla é ambíguo (por exemplo, a tecla "Home", que pode vir da parte principal do teclado ou do teclado numérico) e casos em que a mesma tecla pode mapear para vários códigos de teclas (por exemplo, comportamento do teclado numérico com Num Lock ativado ou desativado). A ramificação final lida com as chaves "normais" cujo código de chave pode ser simplesmente usado no conjunto. O código da chave é indexado no bitmap lque indica se a chave é uma das 101 padrão.

Limitações

  • O programa deve poder testar um teclado 101 e verificar se todas as teclas funcionam.

    Se qualquer tecla diferente da 101 padrão for pressionada, um rastreamento de pilha pode ser impresso com erro padrão ou comportamento inesperado.

  • O programa usa os valores numéricos das constantes do código-chave diretamente e a KeyEventdocumentação da Oracle indica que esses valores podem mudar com o tempo.

Agradecimentos

  • -10 bytes graças a Kevin Cruijssen
Jakob
fonte
2
f.setVisible(1>0);pode ser jogado, f.show();e ()->pode ser jogado v->usando um Void nullparâmetro não utilizado .
Kevin Cruijssen 18/01/19
4

JavaScript, 98 90 75 bytes

Então ... eu suspeito que posso estar pensando mal aqui, mas isso deve funcionar. Deixe-me saber se eu ter esquecido nada. Testado apenas no Chrome.

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

Tente

alert substituído por sua sanidade e ordem revertida para salvar a rolagem.

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>

Shaggy
fonte
Uma coisa que você ignorou é que ela também é reduzida quando você pressiona teclas que não estão no teclado de 101 teclas, como as teclas do Windows.
M4Y 24/01
1
@ M4Y, minha interpretação do desafio foi que assumimos que o teclado especificado está sendo usado, especialmente com esta linha: " se você possui um laptop ou qualquer outro teclado que não possua o layout de teclado padrão US 101, você não pode cumprir o desafio, a menos que você faça o plug-in de um teclado compatível. "
Salsicha
isso é justo o suficiente, suponho, solução inteligente!
M4Y 24/01