Проверьте все клавиши клавиатуры

14

Напишите самую короткую программу, которая ожидает нажатия каждой клавиши стандартной 101-клавишной клавиатуры США * и затем завершает запись OK!

Каждый раз, когда нажимается клавиша, программа отображает в новой строке оставшееся количество не нажатых уникальных клавиш, которые нужно нажимать, пока все клавиши не будут нажаты хотя бы один раз. Программа должна быть в состоянии протестировать клавиатуру 101 и посмотреть, работает ли каждая клавиша. Таким образом, двойное нажатие клавиши или ввода должно быть разрешено, если это указано пользователем.

Нажатие одной и той же клавиши дважды или более не должно нарушать код или изменять отображаемое количество оставшихся нажатых клавиш.

Все ключи ( Left Shift, Right Shift, Right Control, Esc, Enterи т.д.) должны быть включены.

Фактические клавиши клавиатуры важны в этой задаче, поэтому с точки зрения программы ( Aи aтакие же, и такие же 6и ^).

Комбинированные клавиши не будут зарегистрированы в качестве комбинированной команды, и только отдельные клавиши будут зарегистрированы, если нажата Ctrl+ Alt+, Delчто будет учитываться для всех отдельных клавиш в комбинации. Поэтому не нужно нажимать также заглавные буквы, если вы уже нажали строчные буквы и наоборот.

Цифровые клавиши на цифровой клавиатуре отличаются с точки зрения программы, так что они по - прежнему необходимо нажать на программу до конца, если у вас есть ноутбук или любой другой клавиатуры , которая не имеет стандарт США 101 раскладка клавиатуры вас не может выполнить задачу, если вы не подключите совместимую клавиатуру.

* Клавиатуры с клавишей Fn и клавишей ноутбука не поддерживаются, чтобы выполнить эту задачу

Это список клавиш для раскладки клавиатуры стандарта США 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
Можно ли требовать нажатия клавиши Enter / Return после каждого нажатия клавиши? Если нет, это невозможно во многих языках.
Дверная ручка
5
Список ключей, пожалуйста!
feersum
2
Кроме того, должна ли программа поддерживать non-printable-ASCII? (например, Escape, Tab, Ctrl, Shift, Alt, Insert, клавиши со стрелками, Caps Lock, Home, End, Page Up / Down, Backspace, Del, клавиши F и т. д.)? Нужно ли нажимать персонажа и его сдвинутую версию? А как насчет Ctrl + символ? Значения клавиш numpad отличаются от обычных?
Дверная ручка
1
@ Doorknob Вы не можете выполнить задачу, используя клавиатуру ноутбука, если у нее нет всех 101 клавиш, необходимых для раскладки стандартных клавиш США 101
Эдуард Флоринеску
1
@ beta-decay Большинство людей, которые закрыли этот вопрос, никогда не спрашивали, что они не понимают из этого, поэтому мне трудно догадаться.
Эдуард Флоринеску

Ответы:

6

Javascript, 524 байта

Привет, это мой первый пост здесь, так что извините, если я до сих пор ничего не знаю, хотя я думаю, что я остался в рамках правил.

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

Кажется, глючит, если я не использую Chrome, но вы можете попробовать это здесь . (обязательно откройте консоль, прежде чем сфокусироваться на окне примера, так как функциональность по умолчанию для F12 запрещена)

обзор

Программа создает массив из всех 101 "кодов клавиш". Некоторые написаны явно, некоторые последовательности добавляются с циклом for, а некоторые хранятся в виде строк. У меня есть отдельный массив для «двойных» кодов клавиш, поскольку левый и правый элементы управления, например, дают одинаковый код клавиши. Однако они также дают местоположение, поэтому я комбинирую коды клавиш с расположениями в виде строк в массиве. Оттуда это просто EventListener, который предотвращает функциональность keydown по умолчанию (в этом случае не нужно обновлять с помощью F5) и отдельный EventListener для Keyup, потому что каждый ключ может быть обнаружен при keydown, ЗА ИСКЛЮЧЕНИЕМ ДЛЯ PRINTSCREEN.

После каждого события keyup регистрируются оставшиеся ключи (то есть длина массива), а также имя кода ключа (таким образом, существует различие между левым и правым смещением и т. Д.). Я не был уверен, требовалось ли это, если нет, вы можете вычесть еще 10 байтов из результата.

Ограничения

  • Кажется, это хорошо работает только в Chrome

Я надеюсь, что этот ответ приветствуется, и, пожалуйста, дайте мне знать, если я сделал что-то не так.

M4Y
источник
5
Добро пожаловать в PPCG!
FantaC
Можете ли вы изменить некоторые или все точки с запятой на новые строки? Это не поможет вашему количеству байтов, но будет намного легче читать.
Джордан
вот версия, которую намного легче читать pastebin.com/PE4anSFw
M4Y
4

Java 8, 607 + 64 = 671 байт

Это лямбда, принимающая неиспользуемый параметр и выбрасывающая InterruptedException. Он запускает окно, которое, будучи в фокусе, перехватывает нажатия 101 стандартной клавиши. Количество байтов включает в себя лямбда и необходимый импорт.

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

Вы можете найти тестовый класс с негольфированной версией здесь .

обзор

При нажатии клавиш значения, однозначно идентифицирующие их (в большинстве случаев код клавиши), сохраняются в наборе. Первые несколько уровней троичного назначения для cобработки случаев, когда код клавиши неоднозначен (например, клавиша «Домой», которая может исходить из основной части клавиатуры или цифровой клавиатуры), и случаев, когда одна и та же клавиша может отображаться на несколько коды клавиш (например, поведение цифровой клавиатуры при включенной или выключенной Num Lock). Последняя ветвь обрабатывает «нормальные» ключи, код ключа которых можно просто использовать в наборе. Код ключа индексируется в битовой карте, lкоторая указывает, является ли ключ одним из стандартных 101.

Ограничения

  • Программа должна быть в состоянии протестировать клавиатуру 101 и посмотреть, работает ли каждая клавиша.

    Если нажата какая-либо клавиша, отличная от стандартной 101, трассировка стека может быть напечатана со стандартной ошибкой или может возникнуть непредвиденное поведение.

  • Программа напрямую использует числовые значения кодовых констант кода, и KeyEventдокументация Oracle указывает, что эти значения могут изменяться со временем.

Подтверждения

  • -10 байт благодаря Кевину Круйссену
Jakob
источник
2
f.setVisible(1>0);может быть golfed , чтобы f.show();и ()->может быть golfed с v->помощью неиспользуемого Void nullпараметра .
Кевин Круйссен
4

JavaScript, 98 90 75 байт

Так что ... я подозреваю, что я здесь думаю о чем-то, но это должно сработать. Дайте мне знать, если я что-то упустил. Проверено только в Chrome.

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

Попытайся

alert переопределено для вашего здравомыслия и порядок, чтобы сохранить прокрутку.

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>

мохнатый
источник
Одна вещь, которую вы упустили из виду, это то, что она также ведет обратный отсчет при нажатии клавиш, которые не находятся на клавиатуре с 101 клавишей, например клавиши Windows.
M4Y
1
@ M4Y, моя интерпретация проблемы заключалась в том, что мы предполагаем, что указанная клавиатура используется именно этим образом, особенно с учетом следующей строки: « Если у вас есть ноутбук или любая другая клавиатура, которая не имеет раскладки клавиатуры стандарта США 101, вы не сможете ее выполнить. вызов, если вы не подключите совместимую клавиатуру. "
Shaggy
это достаточно справедливо, я полагаю, умное решение!
M4Y