Überprüfen Sie alle Tasten einer Tastatur

14

Schreiben Sie das kürzeste Programm, das darauf wartet, dass jede Taste einer US-Tastatur * mit Standard 101 gedrückt wird, und beenden Sie dann das Schreiben mit OK!

Jedes Mal, wenn eine Taste gedrückt wird, zeigt das Programm in einer neuen Zeile die verbleibende Anzahl nicht gedrückter eindeutiger Tasten an, die gedrückt werden müssen, bis alle Tasten mindestens einmal gedrückt wurden. Das Programm sollte in der Lage sein, eine 101-Tastatur zu testen und festzustellen, ob jede Taste funktioniert. Das zweimalige Drücken einer Taste oder der Eingabetaste ist zuzulassen, solange dies dem Benutzer mitgeteilt wird.

Das zweimalige Drücken derselben Taste sollte weder den Code stören noch die angezeigte Anzahl der noch nicht gedrückten Tasten ändern.

Alle Tasten ( Left Shift, Right Shift, Right Control, Esc, Enter, etc.) sollten einbezogen werden.

Die tatsächlichen Tastaturtasten sind bei dieser Herausforderung aus der Sicht des Programms wichtig ( Aund a, sind gleich und sind es auch 6und ^).

Kombinierte Tasten werden nicht als kombinierter Befehl registriert und nur die einzelnen Tasten werden registriert, wenn Ctrl+ Alt+ Delgedrückt wird, was für alle einzelnen Tasten in der gedrückten Kombination gilt. Sie müssen also nicht auch die Großbuchstaben drücken, wenn Sie bereits die Kleinbuchstaben und umgekehrt gedrückt haben.

Zifferntasten auf dem Ziffernblock unterscheiden sich von der Perspektive des Programms, so dass sie nach wie vor notwendig sind für das Programm bis zum Ende gedrückt werden, wenn Sie einen Laptop oder eine andere Tastatur haben , die nicht die hat US - Standard 101 Tastaturlayout Sie kann die Herausforderung nur erfüllen, wenn Sie eine kompatible Tastatur anschließen.

* Tastaturen mit Fn-Taste und Laptop-Taste werden nicht unterstützt, damit diese Herausforderung ausgeführt werden kann

Dies ist die Liste der Tasten für ein Tastaturlayout nach 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
quelle
1
Darf die Enter / Return-Taste nach jedem Tastendruck gedrückt werden? Wenn nicht, ist dies in vielen Sprachen nicht möglich.
Türklinke
5
Liste der Schlüssel bitte!
Feersum
2
Muss das Programm auch nicht druckbares ASCII unterstützen? ? Müssen sowohl ein Charakter als auch seine verschobene Version gedrückt werden? Was ist mit Strg + ein Zeichen? Zählen die Zifferntasten anders als die normalen?
Türklinke
1
@Doorknob Sie können die Herausforderung nicht mit der Tastatur eines Laptops bewältigen, es sei denn, sie verfügt über alle 101 Tasten, die für das US-Standardlayout mit 101 Tasten erforderlich sind
Eduard Florinescu,
1
@ beta-decay Die meisten Leute, die diese Frage geschlossen haben, haben nie gefragt, was sie nicht verstehen, daher ist es für mich schwer zu erraten.
Eduard Florinescu

Antworten:

6

Javascript, 524 Bytes

Hallo, dies ist mein allererster Post hier. Entschuldigen Sie, wenn ich in einigen Dingen immer noch nichts weiß, ich glaube, ich habe mich jedoch an die Regeln gehalten.

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

Es scheint fehlerhaft zu sein, wenn ich Chrome nicht verwende, aber Sie können es hier ausprobieren . (Stellen Sie sicher, dass Sie die Konsole öffnen, bevor Sie sich auf das Beispielfenster konzentrieren, da die Standardfunktionalität von F12 verhindert wird.)

Überblick

Das Programm erstellt ein Array aller 101 "Schlüsselcodes". Einige werden explizit geschrieben, einige Sequenzen werden mit einer for-Schleife hinzugefügt und andere werden als Zeichenfolgen gespeichert. Ich habe ein separates Array für die "doppelten" Schlüsselcodes, da die linke und rechte Steuerung zum Beispiel den gleichen Schlüsselcode geben. Sie geben jedoch auch eine Position an, sodass ich die Schlüsselcodes mit den Positionen als Zeichenfolgen im Array kombiniere. Von da an ist es nur eine Ereignisliste, die die standardmäßige Tastendruckfunktion verhindert (in diesem Fall keine Aktualisierung mit F5), und eine separate Ereignisliste für den Tastendruck, da jeder einzelne Tastendruck beim Drücken erkannt werden kann, AUSGENOMMEN FÜR DRUCKBILDSCHIRM.

Nach jedem Keyup-Ereignis werden die verbleibenden Keys (auch bekannt als Länge des Arrays) sowie der Name des Keycodes protokolliert (es wird also zwischen Links- und Rechtsverschiebung usw. unterschieden). Ich war mir nicht sicher, ob das eine Anforderung war. Andernfalls können Sie weitere 10 Bytes von der Punktzahl abziehen.

Einschränkungen

  • Es scheint nur in Chrome gut zu funktionieren

Ich hoffe, diese Antwort wird geschätzt und bitte lassen Sie mich wissen, wenn ich etwas falsch gemacht habe.

M4Y
quelle
5
Willkommen bei PPCG!
FantaC
Können Sie einige oder alle Semikolons in Zeilenumbrüche ändern? Es hilft nicht bei der Anzahl der Bytes, aber es wäre viel einfacher zu lesen.
Jordanien
hier ist eine Version , die viel einfacher zu lesen pastebin.com/PE4anSFw
M4Y
4

Java 8, 607 + 64 = 671 Bytes

Dies ist ein Lambda, der einen nicht verwendeten Parameter annimmt und wirft InterruptedException. Es wird ein Fenster geöffnet, in dem beim Fokussieren das Drücken der 101 Standardtasten abgefangen wird. Die Byteanzahl umfasst Lambda und erforderliche Importe.

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

Sie können eine Testklasse mit einer ungolfed Version finden hier .

Überblick

Beim Drücken von Tasten werden Werte, die diese eindeutig identifizieren (in den meisten Fällen der Tastencode), in einem Satz gespeichert. Die ersten Ebenen der ternären Zuordnung zuc behandeln Fälle, in denen der Tastencode mehrdeutig ist (z. B. die "Home" -Taste, die vom Hauptteil der Tastatur oder dem Ziffernblock stammen kann) und Fälle, in denen dieselbe Taste mehreren Tasten zugeordnet werden kann Tastencodes (z. B. Verhalten des Ziffernblocks bei aktivierter oder deaktivierter Num-Taste). Der letzte Zweig behandelt die "normalen" Schlüssel, deren Schlüsselcode einfach im Set verwendet werden kann. Der Schlüsselcode indiziert in die Bitmap, ldie angibt, ob der Schlüssel einer der Standards 101 ist.

Einschränkungen

  • Das Programm sollte in der Lage sein, eine 101-Tastatur zu testen und festzustellen, ob jede Taste funktioniert.

    Wenn eine andere Taste als die Standardtaste 101 gedrückt wird, wird möglicherweise eine Stapelablaufverfolgung auf einen Standardfehler gedruckt, oder es kann ein unerwartetes Verhalten auftreten.

  • Das Programm verwendet die numerischen Werte von Schlüsselcode-Konstanten direkt, und die KeyEventDokumentation von Oracle zeigt an, dass sich diese Werte im Laufe der Zeit ändern können.

Danksagung

  • -10 Bytes dank Kevin Cruijssen
Jakob
quelle
2
f.setVisible(1>0);kann mit einem unbenutzten Parameter golfen werden f.show();und ()->kann v->mit einem unbenutzten Void nullParameter golfen werden .
Kevin Cruijssen
4

JavaScript, 98 90 75 Bytes

Also ... ich vermute, dass ich hier vielleicht ein wenig nachdenklich bin, aber das sollte funktionieren. Lassen Sie mich wissen, wenn ich etwas übersehen habe. Nur in Chrome getestet.

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

Versuch es

alert Für Ihre geistige Gesundheit überschrieben und die Reihenfolge umgekehrt, um das Scrollen zu sparen.

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>

Zottelig
quelle
Eine Sache, die Sie übersehen haben, ist, dass sie auch herunter zählt, wenn Sie Tasten drücken, die sich nicht auf der Tastatur mit 101 Tasten befinden, wie die Windows-Tasten.
M4Y
1
@ M4Y, meine Interpretation der Herausforderung war, dass wir davon ausgehen, dass die angegebene Tastatur verwendet wird, insbesondere in der folgenden Zeile: " Wenn Sie einen Laptop oder eine andere Tastatur haben, die nicht über das Tastaturlayout nach US-Standard 101 verfügt, können Sie dies nicht erfüllen die Herausforderung, es sei denn, Sie stecken eine kompatible Tastatur. "
Shaggy
Das ist fair genug, nehme ich an, clevere Lösung!
M4Y