Vérifier toutes les touches d'un clavier

14

Écrivez le plus court programme qui attend toutes les clés d'un des États - Unis touche clavier standard 101 * à presser puis quitte à écrire OK!

Chaque fois qu'une touche est enfoncée, le programme affiche sur une nouvelle ligne le nombre restant de touches uniques non pressées qui doivent être enfoncées jusqu'à ce que toutes les touches soient enfoncées au moins une fois. Le programme devrait pouvoir tester un clavier 101 et voir si chaque touche fonctionne. Donc, appuyer deux fois sur une touche ou entrer doit être autorisé tant que cela est spécifié à l'utilisateur.

Appuyer deux fois ou plus sur la même touche ne doit pas perturber le code ni modifier le nombre affiché de touches non pressées restantes.

Toutes les touches ( Left Shift, Right Shift, Right Control, Esc,Enter , etc.) devraient être inclus.

Les touches du clavier réels sont importants dans ce défi si du point de vue du programme ( Aet a, sont les mêmes et sont donc 6et ^).

Les touches combinées ne seront pas enregistrées en tant que commande combinée et seules les touches individuelles seront enregistrées si vous appuyez sur Ctrl+ Alt+ Delqui comptera pour toutes les touches individuelles de la combinaison pressée. Donc pas besoin d'appuyer aussi sur les majuscules si vous avez déjà appuyé sur les minuscules et vice-versa.

Les touches numériques du pavé numérique sont différentes du point de vue du programme, elles doivent donc encore être enfoncées pour que le programme se termine, si vous avez un ordinateur portable ou tout autre clavier qui n'a pas la disposition de clavier US Standard 101 que vous ne peut relever le défi que si vous branchez un clavier compatible.

* Les claviers ayant une clé Fn et une clé d'ordinateur portable ne seront pas pris en charge pour que ce défi reste réalisable

Voici la liste des touches pour une disposition de clavier 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
la source
1
Est-il acceptable d'exiger que la touche Entrée / Retour soit enfoncée après chaque pression de touche? Sinon, cela est impossible dans de nombreuses langues.
Poignée de porte
5
Liste des clés svp!
feersum
2
De plus, le programme doit-il prendre en charge ASCII non imprimable? (ex. Échap, Tab, Ctrl, Maj, Alt, Insérer, les touches fléchées, Verrouillage majuscules, Accueil, Fin, Page haut / bas, Retour arrière, Suppr, les touches F, etc.)? Faut-il appuyer sur un personnage et sa version décalée? Et Ctrl + un caractère? Les touches du pavé numérique comptent-elles différemment des touches ordinaires?
Poignée de porte
1
@ Doorknob Vous ne pouvez pas relever le défi en utilisant le clavier d'un ordinateur portable à moins qu'il n'ait toutes les 101 touches requises par la disposition des 101 normes américaines
Eduard Florinescu
1
@ beta-decay La plupart des personnes qui ont fermé cette question n'ont jamais demandé ce qu'elles ne comprenaient pas, il est donc difficile pour moi de deviner.
Eduard Florinescu

Réponses:

6

Javascript, 524 octets

Salut, c'est mon premier post ici, alors excusez-moi si je suis encore ignorant sur certaines choses, je pense que je suis resté dans les règles.

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

Cela semble bogué si je n'utilise pas Chrome, mais vous pouvez l'essayer ici . (assurez-vous d'ouvrir la console avant de vous concentrer sur la fenêtre d'exemple, car la fonctionnalité par défaut de F12 est empêchée)

Aperçu

Le programme crée un tableau de tous les 101 "codes clés". Certaines sont écrites explicitement, certaines séquences sont ajoutées avec une boucle for et certaines sont stockées sous forme de chaînes. J'ai un tableau séparé pour les codes-clés "doubles", car les commandes gauche et droite, par exemple, donnent le même code-clé. Cependant, ils donnent également un emplacement, donc je combine les codes clés avec les emplacements en tant que chaînes dans le tableau. À partir de là, il n'y a qu'un écouteur d'événements qui empêche la fonctionnalité de keydown par défaut (vous ne voulez pas actualiser avec F5 dans ce cas) et un écouteur d'événements séparé pour keyup, car chaque clé peut être détectée lors du keydown, SAUF POUR PRINTSCREEN.

Après chaque événement de frappe, les clés restantes (c'est-à-dire la longueur du tableau) sont enregistrées, ainsi que le nom du code de touche (il y a donc la distinction entre le décalage gauche et droit, etc.). Je ne savais pas si c'était une exigence, sinon vous pouvez soustraire 10 autres octets du score.

Limites

  • Cela ne semble bien fonctionner que dans Chrome

J'espère que cette réponse est appréciée et faites-moi savoir si j'ai fait quelque chose de mal.

M4Y
la source
5
Bienvenue chez PPCG!
FantaC
Pouvez-vous remplacer certains ou tous les points-virgules par des sauts de ligne? Cela n'aidera pas votre nombre d'octets mais ce serait beaucoup plus facile à lire.
Jordan
voici une version beaucoup plus facile à lire pastebin.com/PE4anSFw
M4Y
4

Java 8, 607 + 64 = 671 octets

Il s'agit d'un lambda prenant un paramètre inutilisé et le lançant InterruptedException. Il ouvre une fenêtre qui, lorsqu'elle est mise au point, intercepte les pressions sur les 101 touches standard. Le nombre d'octets inclut lambda et les importations requises.

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

Vous pouvez trouver une classe de test avec une version non golfée ici .

Aperçu

Lorsque les touches sont enfoncées, les valeurs les identifiant de manière unique (dans la plupart des cas, le code de touche) sont stockées dans un ensemble. Les premiers niveaux de l'affectation ternaire pour cgérer les cas où le code clé est ambigu (par exemple, la touche "Accueil", qui pourrait provenir de la partie principale du clavier ou du pavé numérique) et les cas où la même clé peut correspondre à plusieurs codes clés (par exemple, comportement du pavé numérique avec verrouillage numérique activé ou désactivé). La branche finale gère les clés "normales" dont le code clé peut simplement être utilisé dans l'ensemble. Le code de clé est indexé dans le bitmap lqui indique si la clé est l'une des 101 standard.

Limites

  • Le programme devrait pouvoir tester un clavier 101 et voir si chaque touche fonctionne.

    Si une touche autre que la norme 101 est enfoncée, une trace de pile peut être imprimée sur une erreur standard ou un comportement inattendu peut se produire.

  • Le programme utilise directement les valeurs numériques des constantes de code clés et la KeyEventdocumentation d'Oracle indique que ces valeurs peuvent changer au fil du temps.

Remerciements

  • -10 octets grâce à Kevin Cruijssen
Jakob
la source
2
f.setVisible(1>0);peut être joué au golf f.show();et ()->peut être joué au golf v->en utilisant un Void nullparamètre inutilisé .
Kevin Cruijssen
4

JavaScript, 98 90 75 octets

Alors ... je soupçonne que je pense peut-être des choses ici, mais cela devrait fonctionner. Permettez - moi de savoir si je l' ai oublié quoi que ce soit. Testé uniquement dans Chrome.

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

Essayez-le

alert remplacé pour votre santé mentale et l'ordre inversé pour enregistrer le défilement.

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>

Hirsute
la source
Une chose que vous avez négligée est qu'elle décompte également lorsque vous appuyez sur des touches qui ne sont pas sur le clavier à 101 touches, comme les touches Windows.
M4Y
1
@ M4Y, mon interprétation du défi était que nous supposons que le clavier spécifié est ce qui est utilisé, en particulier compte tenu de cette ligne: " si vous avez un ordinateur portable ou tout autre clavier qui n'a pas la disposition de clavier US Standard 101, vous ne pouvez pas répondre le défi à moins de brancher un clavier compatible. "
Shaggy
c'est assez juste je suppose, une solution intelligente!
M4Y