La tâche consiste à écrire du code pour identifier la touche enfoncée sur le clavier. Vous pouvez supposer qu'une seule touche est enfoncée à la fois et qu'il existe une disposition de clavier américaine standard. C'est la disposition avec le @ sur le 2.
Votre code doit générer un identifiant unique pour chaque touche enfoncée. Cela comprend PrtScn, Scroll Lock, Pause, gauche Shift, droite Shift, gauche Ctrl, droite Ctrl, Caps Lock, Tab, Enter, Enter sur le pavé numérique, Num Lock, Insert, Ins sur le pavé numérique, Backspace, Del, F1 ... F12, Esc, touche Windows gauche, touche Windows droite, Alt, AltGr, touche application (menu contextuel) et ainsi de suite.
Votre code doit continuer d'attendre les pressions sur les touches et de sortir leur identité jusqu'à ce qu'il soit tué. Cependant, il devrait sortir l'identifiant dès qu'une clé est relâchée. Il ne doit effectuer aucune autre action à partir des pressions sur les touches qu'il reçoit et il ne doit rien produire en dehors de l'identifiant unique.
Dans votre réponse, veuillez indiquer ce que vous codez les sorties pour les pressions de touches suivantes: Tab, Pause, Entrée, Entrée sur le pavé numérique, touche Windows gauche, touche Windows droite, Insérer et insérer sur le pavé numérique.
Si vous avez un clavier très différent, le défi est toujours de sortir un identifiant différent pour chaque touche de votre clavier.
Réponses:
Code machine x86, exécutable DOS,
29* 28 octetsIl s'agit d'un exécutable COM pour MS-DOS , il nécessite un matériel compatible IBM PC .
En particulier un contrôleur 8042 PS / 2 ou plus probablement une émulation via SMM .
Pour faire court, il devrait fonctionner dès la sortie de la boîte sur n'importe quel PC ordinaire.
Le code source est
J'ai divisé le programme en deux parties.
La première partie traite de la lecture des scancodes . Les scancodes sont des valeurs numériques associées à chaque touche.
Notez que ce sont du code matériel, ils ne dépendent pas du système d'exploitation ou du jeu de caractères. Ils sont comme une paire codée (colonne, ligne) de la clé.
Chaque touche a un scancode, même ces touches de fonction étranges non standard trouvées sur certains claviers (par exemple la touche "open calc").
Certaines clés ont un scancode multi-octets, elles ont des préfixes conçus pour rendre le flux décodifiable en regardant simplement la séquence d'octets.
Ainsi, chaque clé obtient son identifiant unique, même CTRL, SHIFT, WinKeys et ainsi de suite.
Seuls les "codes de rupture", envoyés lorsqu'une touche est relâchée, sont traités, les "codes de création" sont ignorés.
Les formateurs ont le bit le plus élevé (bit 7 pour un octet), il est donc facile de les reconnaître.
La deuxième partie traite de l'impression d'un octet.
L'impression est toujours longue en assemblage, nous n'avons pas de fonctions intégrées.
Pour faire court, et comme il fallait écrire un identifiant de la clé, j'ai abandonné les chiffres décimaux ou hexadécimaux au profit d'un encodage personnel.
Un octet xy, où x est le quartet supérieur et y le plus petit est affiché sous la forme de deux caractères successifs c 0 et c 1 définis comme:
c 0 = 0x21 + y
c 1 = 0x21 + x
Notez que le quartet inférieur est imprimé en premier (cela m'a épargné un échange).
Le raisonnement est de mapper chacune des 16 valeurs possibles d'un quartet en caractères ASCII consécutifs à partir de '!'.
Autrement dit, c'est un chiffre hexadécimal, mais avec
!"#$%&'()*+,-./01
comme chiffre (als) au lieu de0123456789abcdef
L' exécuter dans DOSBox et appuyer sur une touche aléatoire (dont certaines sont une clé spéciale mais notez qu'en tant que processus Windows, DOSBox ne peut pas capturer toutes les clés) donne
Notez que ce programme ne se termine jamais (en outre, il prend le contrôle complet du PC en désactivant les interruptions) comme je pense que la question le voulait (simplement, il n'y a pas de destruction de processus sous DOS).
* Remerciements réduits à CodyGray .
la source
IN
instruction s'est avérée plus petite en termes d'octets que d'appeler les interruptions du BIOS ROM (par exempleint 16h
, fonction 10h)?in
instruction. C'est en fait un très bon point que vous avez. Si vous ne l'avez pas déjà fait, pourquoi ne pas l'afficher comme réponse? :)xchg
l'accumulateur comme l'un des registres est de 1 octet, donc c'est mieux qu'un 2 octetsmov
.int 16h
est que je n'obtiens pas de codes de numérisation pour les touches Maj, le verrouillage du défilement ou la pause / pause (peut-être d'autres), et cela est requis par le défi. Votre solution de lecture de l'entrée directement à partir des E / S fonctionne, bien qu'elle me semble renvoyer la même valeur pour toutes les clés du cluster Ins / Del / Home / End / PgUp / PgDown.Java 7 ou supérieur,
246228 octetsNon golfé:
-18 merci à @ OlivierGrégoire pour
show()
,0<0
etimport java.awt.event.*;
Ce qui se traduit par:
Gère même les presses Maj pour les caractères en majuscule, la touche Windows, les verrous de majuscules, etc.
la source
HTML (avec Javascript),
4631 caractères,4631 octetsEn utilisant cela pour différencier l'entrée et le retour du pavé numérique, LControl et RControl ...Plus depuis que les apsillers ont trouvé un moyen de le faire avec un appel de fonction de signalisation.Sorties spécifiques:
LES SORTIES QUI SONT ENCORE AVEC LES CHIFFRES SONT CEUX QUE JE NE PEUX PAS TESTER SUR MON ORDINATEUR PORTABLE,
VEUILLEZ ATTENDRE QUE J'AI ACCÈS À CES CLÉS
PrtScn -> PrintScreen
Scroll Lock -> ScrollLock
Pause -> Pause
left Shift -> ShiftLeft
right Shift -> ShiftRight
left Ctrl -> ContrlLeft
right Ctrl -> ControlRight
Caps Lock ->
Tab LockLock -> Tab
Enter -> Enter
Entrez le numéro pavé numérique -> NumpadEnter
Num Lock -> NumLock
Insert -> Insert
Ins sur le pavé numérique -> Numpad0
Backspace -> Backspace
Del -> Delete
F1 ... F12 -> F1 to F12
Esc -> Escape
left Windows key -> MetaLeft
right Touche Windows -> MetaRight
Alt -> AltLeft
AltGr -> AltRight (sorte de buggy, il détecte ControlLeft puis AltRight,mais c'est bien AltRight)
clé d'application (menu contextuel) -> ContextMenu
EDITs:
1 octet enregistré
;
après l'appel func18 octets enregistrés grâce aux Lil 'Bits et aux productions ETH, ils ont remarqué que j'avais oublié de raccourcir les noms func et var.
32 octets économisés grâce à RogerSpielker, il a remarqué que je faisais du code épargné sans raison; et encore -2 octets:
onkeydown
->onkeyup
1 octet enregistré: pas besoin de barre oblique finale
2 octets enregistrés grâce à CraigAyre:
with()
fonction2 octets enregistrés grâce à ASCII uniquement:
key
au lieu dewhich
4 octets enregistrés, puisque nous avons du texte, il n'y a pas besoin pour
'-'+
(chaque identifiant est unique sans cela) 1 octet enregistré grâce à ASCII uniquement (encore): plus de symbole de fermeture>
15 octets enregistrés grâce à apsillers, comme dit en haut de ma réponse.la source
<body onkeydown=return!!alert(event.code)>
devrait faire l'affaire en revenantfalse
surkeydown
Tcl / Tk, 22 caractères
Exemple d'exécution:
Remarques:
unconcepteurintelligent amis le commutateur de rétroéclairage à sa place)la source
Bash avec X.org, 21 octets
Malheureusement, je ne peux pas le tester car je suis sur MacBook sous Linux - pas de PrntScr, pas de clavier numérique et tout.
xev
est un outil qui génère des événements de souris et de clavier sousX.org
. Je le redirige vers awk, filtre les lignes paires (puisque chaque touche est affichée lorsque la touche est enfoncée, puis lorsqu'elle est relâchée), et sélectionne uniquement celles qui contiennent(k
- cette chaîne se trouve dans chaque ligne qui décrit la touche enfoncée.la source
showkey -s
-la: P), ou sur un bureau GUI Wayland pur. C'est vraiment une réponse bash + Xorg.C et Win32,
240224216 216205202194191 octetsLes sorties
TAB:
F0008C00F0008
PAUSE:
450012C0450012
ENTER:
1C000CC01C000C
NUMPAD-ENTER:
11C000CC11C000C
WINDOWS-LEFT:
15B005AC15B005A
WINDOWS-RIGHT:
15C005DC15C005D
INSERT:
152002CC152002C
NUMPAD-INSERT:
52002CC052002C
Explication
Modifications
-16 grâce à @ugoren
-8: changé
WNDCLASS
enint
tableau puisque les 10 membres font 4 octets-11: initialisation partielle du tableau de données wndclass, réduite à 9 éléments
-3: utiliser le
int
déclin implicite pour le tableau wndclass-data-8: supprimer la nouvelle ligne du format de sortie (non requis dans les spécifications et les vidages printf immédiatement sans); passer
RegisterClass
àCreateWindow
arg, en utilisant retournéATOM
; définissez le nom de la classe wnd surm
qui n'a besoin que d'un octet zéro pour être une chaîne valide.-3: réutiliser
w
var pour lesMSG
donnéesla source
<iostream>
+std::cout<<a^b<<"\n"
est plus long. De plus, je pense que vous auriez besoin d'ajouter des types de retour aux fonctions decls, etm
ne pourrait pas être impliciteint
.for(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
p(x,y,a,b)
et(void*)p
devrait en sauver quelques-uns.Java (OpenJDK 8) , 369 octets
Cela ne peut pas être exécuté avec TIO car il utilise une interface graphique, mais cela fonctionne sur mon ordinateur.
Non golfé / Explication:
la source
setFocusTraversalKeysEnabled(false);
dans votre réponse va résoudre ce problème.Scala 2.10+, 279 caractères, 279 octets
Maintenant, c'est une réponse scala :) même si j'ai l'impression de faire Java. Quoi qu'il en soit, nous ne pouvons pas le tester sur TIO.
C'est triste, nous devons déclarer toutes les méthodes héritées même si nous ne les utilisons pas: l puis-je les supprimer du nombre d'octets, car certains drapeaux du compilateur peuvent permettre de ne pas les déclarer?
Cela affiche (comme pour ma réponse html-js) le keyPressed, "-" puis son "emplacement".
Par exemple :
PrtScn -> non vérifiable
Scroll Lock -> 145-1
Pause -> 19-1
left Shift -> 16-2
right Shift -> 16-3
left Ctrl -> 17-2
right Ctrl -> 17-3
Caps Lock ->
Onglet 20-1 -> non vérifiable
Entrée -> 10-1
Entrée sur le pavé numérique -> 10-4
Verr Num -> 144-4
Insertion -> 96-1
Ins sur le pavé numérique -> 96-4
Retour arrière -> 8-1
Suppr -> 127-1
F1 ... F12 -> 112-1 à 123-1
Esc
-> 27-1 touche Windows gauche -> 524-2
touche Windows droite -> 524-3
Alt -> 18- 2
AltGr -> 18-3 (sorte de buggy, il détecte 17-2 puis 18-3,mais c'est bien 18-3)
clé d'application (menu contextuel) -> 525-1
Bien que je pense que cela dépend de l'ordinateur: / Je suis actuellement sur un ordinateur portable azerty.
la source
-std=c89
car les compilateurs modernes sont par défaut c99 ou c11, mais n'ont pas besoin de compter cela. Donc, je ne sais pas quelle serait la décision de la méta-code-golf.TI-BASIC, 19 octets
Voici une illustration du reste des touches:
Explication:
Malheureusement, cela n'est pas possible dans Arnold C, j'ai donc dû m'en tenir à TI-BASIC.
la source
C #, 144 + 601 = 745 octets
Se compose de deux classes, je n'ai pas réussi à les combiner avec succès en une seule classe.
Classe principale:
Classe de crochet:
Les sorties:
137
147
141
142
220
221
174
224
la source
||
à d'|
autres golfs similaires, mais mon cerveau a besoin de repos après avoir fait ça!public int v;public int c;public int f;
pourrait être raccourci àpublic int v,c,f;
AutoHotkey , 26 octets
Impossible de tester (gagnant uniquement), mais l'
M
option indiqueDonc ça devrait bien marcher.
la source
WinApi C ( gcc ), 156 octets
Ce programme imprime le code de clé virtuelle Windows associé à chaque touche d'entrée du clavier. Le
\n
dans leprintf
format chaîne est facultative (mais rend la sortie de l' environnement humain) et peut être abandonné pour un score total de 154 octets . Un moyen facile de tuer le programme (sans taskmgr) est avecCTRL + PAUSE
. Si vous avez un clavier avec une touche Fn, ce programme ne peut pas le récupérer car il n'est même pas remarqué par Windows.#include <d3d.h>
astuce et l'inspiration pour leBYTE
tableau.Le programme avec des variables locales, la lisibilité et sans avertissements du compilateur ressemble à ceci:
la source
C (gcc) + Win32, 94
9598105107110octetsLe code capture des clés même après la perte du focus.
Les captures d'écran suivantes sont enregistrées en ajoutant des espaces entre les sorties (
printf("%d ",j);
+1 octet) pour une meilleure lisibilité: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
Le code utilise
GetAsyncKeyState
pour interroger l'état des clés sans vérifier la file d'attente des messages, généralement plus en temps réel que les autres approches en mode utilisateur (sauf DirectInput). Cette approche est largement utilisée dans les enregistreurs de frappe.(j<16||j>18)
filtre régulièrement Ctrl / Alt / Maj. 16/17/18 est déclenché chaque fois que vous appuyez à gauche ou à droite, avec la valeur de la touche v spécifiée par l'emplacement.la source
PowerShell, 34 octets
Sorties sur la même ligne que l'entrée, ce qui peut être un peu déroutant.
la source