Controlla tutti i tasti di una tastiera


14

Scrivi il programma più breve che attende che venga premuto ogni tasto di una tastiera US 101 standard * e poi esce scrivendo OK!

Ogni volta che si preme un tasto, il programma visualizza su una nuova riga il numero rimanente di tasti unici non compressi che devono essere premuti fino a quando tutti i tasti vengono premuti almeno una volta. Il programma dovrebbe essere in grado di testare una tastiera 101 e vedere se ogni tasto funziona. Quindi premere due volte un tasto o invio è consentito purché sia ​​specificato per l'utente.

La pressione dello stesso tasto due o più volte non deve interrompere il codice né modificare il numero visualizzato di tasti non compressi rimanenti.

Tutti i tasti ( Left Shift, Right Shift, Right Control, Esc, Enter, etc.) devono essere inclusi.

Gli attuali tasti della tastiera sono importanti in questa sfida, quindi dal punto di vista del programma ( Ae a, sono gli stessi e così sono 6e ^).

I tasti combinati non verranno registrati come comando combinato e verranno registrati solo i singoli tasti se si preme Ctrl+ Alt+ Delche conterà per tutti i singoli tasti nella combinazione che viene premuta. Quindi non è necessario premere anche le lettere maiuscole se hai già premuto le lettere minuscole e viceversa.

I tasti numerici sul tastierino numerico sono diversi dalla prospettiva del programma, quindi devono ancora essere premuti per terminare il programma, se si dispone di un laptop o di qualsiasi altra tastiera che non ha il layout di tastiera US Standard 101 voi non è possibile rispondere alla sfida se non si inserisce una tastiera compatibile.

* Le tastiere con tasto Fn e tasto laptop non saranno supportate per mantenere questa sfida fattibile

Questo è l'elenco dei tasti per un layout di tastiera 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

1
Va bene richiedere la pressione del tasto Invio / Ritorno dopo ogni pressione del tasto? Altrimenti, ciò è impossibile in molte lingue.
Maniglia della porta

5
Elenco di chiavi per favore!
feersum,

2
Inoltre, il programma deve supportare ASCII non stampabile? (es. Esc, Tab, Ctrl, Maiusc, Alt, Inserisci, i tasti freccia, Blocco maiuscole, Home, Fine, Pagina su / giù, Backspace, Canc, i tasti F, ecc.)? È necessario premere un personaggio e la sua versione spostata? Che dire di Ctrl + un personaggio? I tasti del tastierino numerico contano in modo diverso da quelli normali?
Maniglia della porta

1
@Doorknob Non puoi superare la sfida usando la tastiera di un laptop a meno che non abbia tutti i 101 tasti richiesti dal layout dei tasti 101 standard USA
Eduard Florinescu,

1
@ beta-decadimento La maggior parte delle persone che hanno chiuso questa domanda non si sono mai chiesti cosa non capiscono, quindi è difficile da indovinare.
Eduard Florinescu,

Risposte:


6

Javascript, 524 byte

Ciao, questo è il mio primo post in assoluto qui, quindi scusami se sono ancora ignorante su alcune cose, penso di essere rimasto comunque all'interno delle regole.

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

Sembra buggy se non uso Chrome, ma puoi provarlo qui . (assicurati di aprire la console prima di concentrarti sulla finestra di esempio, poiché viene impedita la funzionalità predefinita di F12)

Panoramica

Il programma crea una matrice di tutti i 101 "codici chiave". Alcuni sono scritti esplicitamente, alcune sequenze sono aggiunte con un ciclo for e alcune sono memorizzate come stringhe. Ho un array separato per i "doppi" codici chiave, poiché il controllo destro e sinistro, ad esempio, danno lo stesso codice chiave. Danno anche una posizione, tuttavia, quindi combino i codici chiave con le posizioni come stringhe nell'array. Da lì è solo un listener di eventi che impedisce la funzionalità di keydown predefinita (in questo caso non voglio aggiornare con F5) e un listener di eventi separato per keyup, perché ogni singolo tasto può essere rilevato su keydown, EXCEPT FOR PRINTSCREEN.

Dopo ogni evento di keyup vengono registrate le chiavi rimanenti (ovvero la lunghezza dell'array), così come il nome del keycode (quindi c'è la distinzione tra shift sinistro e destro, ecc.). Non ero sicuro che fosse un requisito, altrimenti puoi sottrarre altri 10 byte dal punteggio.

limitazioni

  • Sembra funzionare bene solo in Chrome

Spero che questa risposta sia apprezzata e per favore fatemi sapere se ho fatto qualcosa di sbagliato.


5
Benvenuti in PPCG!
FantaC,

Puoi cambiare alcuni o tutti i punti e virgola in newline? Non aiuterà il conteggio dei byte, ma sarebbe molto più facile da leggere.
Giordania,

ecco una versione che è molto più facile da leggere pastebin.com/PE4anSFw
M4Y

4

Java 8, 607 + 64 = 671 byte

Questo è un lambda che prende un parametro inutilizzato e lancia InterruptedException. Avvia una finestra che, quando è a fuoco, intercetta le pressioni dei 101 tasti standard. Il conteggio dei byte include lambda e le importazioni richieste.

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

Puoi trovare una classe di prova con una versione non golfata qui .

Panoramica

Quando i tasti vengono premuti, i valori che li identificano in modo univoco (nella maggior parte dei casi il codice tasto) vengono memorizzati in un set. I primi livelli dell'assegnazione ternaria per cgestire i casi in cui il codice tasto è ambiguo (ad esempio il tasto "Home", che potrebbe provenire dalla parte principale della tastiera o il tastierino numerico) e i casi in cui lo stesso tasto può essere associato a più codici chiave (ad es. comportamento del tastierino numerico con Bloc Num attivato o disattivato). Il ramo finale gestisce le chiavi "normali" il cui codice chiave può essere semplicemente usato nel set. Il codice chiave viene indicizzato nella bitmap lche indica se la chiave è una delle 101 standard.

limitazioni

  • Il programma dovrebbe essere in grado di testare una tastiera 101 e vedere se ogni tasto funziona.

    Se si preme un tasto diverso dallo standard 101, è possibile che venga stampata una traccia dello stack in errore standard, oppure potrebbero verificarsi comportamenti imprevisti.

  • Il programma utilizza direttamente i valori numerici delle costanti del codice chiave e la KeyEventdocumentazione di Oracle indica che questi valori possono cambiare nel tempo.

Ringraziamenti

  • -10 byte grazie a Kevin Cruijssen

2
f.setVisible(1>0);può essere giocato a golf f.show();e ()->può essere giocato v->utilizzando un Void nullparametro non utilizzato .
Kevin Cruijssen il

4

JavaScript, 98 90 75 byte

Quindi ... sospetto che qui potrei pensare male, ma dovrebbe funzionare. Fatemi sapere se io ho trascurato nulla. Testato solo su Chrome.

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

Provalo

alert ignorato per la tua sanità mentale e ordine invertito per salvare lo scorrimento.

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>


Una cosa che hai trascurato è che conta anche il conto alla rovescia quando premi i tasti che non si trovano sulla tastiera a 101 tasti, come i tasti di Windows.
M4Y,

1
@ M4Y, la mia interpretazione della sfida è stata quella di supporre che la tastiera specificata sia quella che viene utilizzata, specialmente data questa linea: " se hai un laptop o qualsiasi altra tastiera che non ha il layout di tastiera US 101 Standard che non puoi soddisfare la sfida a meno che non si inserisca una tastiera compatibile. "
Shaggy,

è abbastanza giusto suppongo, soluzione intelligente!
M4Y,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.