Sprawdź wszystkie klawisze klawiatury

14

Napisz najkrótszy program, który czeka na każdym kluczu o standard 101 klucz amerykańskiej klawiaturze * być wciśnięty, a następnie kończy pisanie OK!

Za każdym naciśnięciem klawisza program wyświetla w nowym wierszu pozostałą liczbę niespakowanych unikalnych klawiszy, które należy nacisnąć, aż wszystkie klawisze zostaną naciśnięte przynajmniej raz. Program powinien być w stanie przetestować klawiaturę 101 i sprawdzić, czy każdy klawisz działa. Tak więc dwukrotne naciśnięcie klawisza lub enter powinno być dozwolone, o ile jest to określone dla użytkownika.

Dwukrotne naciśnięcie tego samego klawisza nie powinno zakłócać kodu ani zmieniać wyświetlanej liczby pozostałych nie naciśniętych klawiszy.

Wszystkie klucze ( Left Shift, Right Shift, Right Control, Esc, Enter, itd.) Powinny być uwzględnione.

Rzeczywiste klawisze klawiatury są ważne w tym wyzwaniu, więc z perspektywy programu ( Ai asą takie same, a więc 6i ^).

Połączone klawisze nie zostaną zarejestrowane jako kombinacja poleceń i tylko pojedyncze klawisze zostaną zarejestrowane, jeśli zostanie naciśnięty klawisz Ctrl+ Alt+, Delco będzie się liczyć dla wszystkich poszczególnych klawiszy w kombinacji. Więc nie musisz naciskać również wielkich liter, jeśli naciśniesz już małe litery i odwrotnie.

Klawisze numeryczne na klawiaturze numerycznej różnią się od perspektywy programu, więc nadal trzeba je nacisnąć, aby zakończyć program, jeśli masz laptopa lub inną klawiaturę, która nie ma układu klawiatury US Standard 101 , nie może sprostać wyzwaniu, chyba że podłączysz kompatybilną klawiaturę.

* Klawiatury z klawiszem Fn i klawiszem laptopa nie będą obsługiwane, aby sprostać temu wyzwaniu

Oto lista klawiszy dla układu klawiatury 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
źródło
1
Czy można wymagać naciskania klawisza Enter / Return po każdym naciśnięciu klawisza? Jeśli nie, jest to niemożliwe w wielu językach.
Klamka
5
Proszę o listę kluczy!
feersum
2
Ponadto, czy program musi obsługiwać ASCII niedrukowalne? (np. Escape, Tab, Ctrl, Shift, Alt, Insert, klawisze strzałek, Caps Lock, Home, End, Page Up / Down, Backspace, Del, F-klucze itp.)? Czy znak i jego zmieniona wersja muszą być wciśnięte? Co z Ctrl + postacią? Czy klawisze numeryczne liczą się inaczej niż zwykłe klawisze?
Klamka
1
@Doorknob Nie możesz sprostać wyzwaniu za pomocą klawiatury laptopa, chyba że ma ona wszystkie 101 klawiszy wymaganych w układzie 101 klawiszy amerykańskiego standardu
Eduard Florinescu
1
@ beta-decay Większość osób, które zamknęły to pytanie, nigdy nie zadawało pytań, których nie rozumieją, więc trudno mi się domyślić.
Eduard Florinescu

Odpowiedzi:

6

JavaScript, 524 bajtów

Cześć, to mój pierwszy post tutaj, więc przepraszam, jeśli nadal jestem ignorantem w niektórych sprawach, myślę jednak, że przestrzegałem zasad.

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

Jeśli nie używam Chrome, wydaje się to wadliwe, ale możesz go wypróbować tutaj . (pamiętaj, aby otworzyć konsolę przed skupieniem się na oknie przykładowym, ponieważ domyślna funkcjonalność F12 jest wyłączona)

Przegląd

Program tworzy tablicę wszystkich 101 „kodów klawiszy”. Niektóre są napisane jawnie, niektóre sekwencje są dodawane za pomocą pętli for, a niektóre są przechowywane jako ciągi znaków. Mam osobną tablicę dla „podwójnych” kodów, ponieważ na przykład lewa i prawa kontrola dają ten sam kod. Podają także lokalizację, więc łączę kody klawiszy z lokalizacjami jako ciągi znaków w tablicy. Stamtąd jest to tylko eventlistener, który uniemożliwia domyślną funkcję keydown (w tym przypadku nie chcę odświeżać przy pomocy F5) i oddzielny eventlistener dla keyup, ponieważ każdy klucz można wykryć podczas keydown, Z WYJĄTKIEM PRINTSCREEN.

Po każdym zdarzeniu keyup rejestrowane są pozostałe klucze (zwane też długością tablicy), a także nazwa kodu klucza (więc istnieje różnica między przesunięciem w lewo i w prawo itp.). Nie byłem pewien, czy to wymaganie, jeśli nie, możesz odjąć kolejne 10 bajtów od wyniku.

Ograniczenia

  • Wygląda na to, że działa dobrze tylko w Chrome

Mam nadzieję, że ta odpowiedź zostanie doceniona i proszę dać mi znać, jeśli zrobiłem coś złego.

M4Y
źródło
5
Witamy w PPCG!
FantaC
Czy możesz zmienić niektóre lub wszystkie średniki na nowe znaki? Nie pomoże ci to w liczeniu bajtów, ale będzie o wiele łatwiejszy do odczytania.
Jordan
oto wersja o wiele łatwiejsza do przeczytania pastebin.com/PE4anSFw
M4Y
4

Java 8, 607 + 64 = 671 bajtów

Jest to lambda przyjmująca nieużywany parametr i rzucająca InterruptedException. Uruchamia okno, które po ustawieniu ostrości przechwytuje naciśnięcia 101 standardowych klawiszy. Liczba bajtów obejmuje lambda i wymagany import.

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

Możesz znaleźć klasę testową z wersją bez golfa tutaj .

Przegląd

Gdy klawisze są naciskane, wartości jednoznacznie je identyfikujące (w większości przypadków kod klucza) są przechowywane w zestawie. Pierwsze kilka poziomów przypisania trójskładnikowego do cobsługi przypadków, w których kod klawisza jest niejednoznaczny (np. Klawisz „Home”, który może pochodzić z głównej części klawiatury lub klawiatury numerycznej) oraz przypadków, w których ten sam klawisz można odwzorować na wiele kody klawiszy (np. zachowanie klawiatury numerycznej przy włączonym lub wyłączonym Num Lock). Ostatnia gałąź obsługuje „normalne” klucze, których kodu klucza można po prostu użyć w zestawie. Kod klucza indeksuje się do mapy bitowej, lktóra wskazuje, czy klucz jest jednym ze standardowych 101.

Ograniczenia

  • Program powinien być w stanie przetestować klawiaturę 101 i sprawdzić, czy każdy klawisz działa.

    Jeśli zostanie naciśnięty dowolny klawisz inny niż standardowy 101, ślad stosu może zostać wydrukowany na błąd standardowy lub może wystąpić nieoczekiwane zachowanie.

  • Program korzysta bezpośrednio z wartości liczbowych stałych kodu klucza, a KeyEventdokumentacja Oracle wskazuje, że wartości te mogą się zmieniać z czasem.

Podziękowanie

  • -10 bajtów dzięki Kevin Cruijssen
Jakob
źródło
2
f.setVisible(1>0);można grać w golfa f.show();i ()->można w niego grać v->, używając nieużywanego Void nullparametru .
Kevin Cruijssen
4

JavaScript, 98 90 75 bajtów

Więc ... Podejrzewam, że myślę o tym, ale to powinno zadziałać. Daj mi znać, jeśli nie pominąć niczego. Testowane tylko w Chrome.

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

Spróbuj

alert nadpisane dla twojego zdrowia psychicznego i odwróconego porządku, aby zapisać przewijanie.

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>

Kudłaty
źródło
Jedną z rzeczy, które przeoczyłeś, jest to, że odlicza się także po naciśnięciu klawiszy, których nie ma na 101-klawiszowej klawiaturze, takich jak klawisze Windows.
M4Y
1
@ M4Y, moja interpretacja wyzwania polegała na tym, że zakładamy, że używana jest określona klawiatura, szczególnie biorąc pod uwagę ten wiersz: „ jeśli masz laptopa lub inną klawiaturę, która nie ma układu klawiatury US Standard 101, nie możesz spełnić wyzwanie, chyba że podłączysz kompatybilną klawiaturę.
Shaggy
to chyba sprawiedliwe, sprytne rozwiązanie!
M4Y