Перевірте всі клавіші клавіатури


14

Напишіть найкоротшу програму, яка чекає натискання кожної клавіші американської клавіатури Standard 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
Крім того, чи повинна програма підтримувати недрукувальний ASCII? (наприклад, Escape, Tab, Ctrl, Shift, Alt, Insert, клавіші зі стрілками, Caps Lock, Головна, Кінець, Сторінка вгору / вниз, Backspace, Del, клавіші F тощо)? Чи потрібно натиснути персонаж та його зміщену версію? Що з Ctrl + символом? Чи вважаються клавіші numpad інакше, ніж звичайні?
Дверна ручка

1
@Doorknob Ви не можете виконати виклик за допомогою клавіатури ноутбука, якщо у нього немає всіх клавіш, необхідних для розкладки клавіш зі
штатним

1
@ бета-розпад Більшість людей, які закрили це питання, ніколи не питали, чого вони не розуміють, тому мені важко здогадатися.
Едуард Флорінеску,

Відповіді:


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, який перешкоджає функціонуванню клавіатури за замовчуванням (не хочу оновити F5 в цьому випадку) та окремий eventlistener для клавіш, тому що кожна клавіша може бути виявлена ​​при натисканні клавіші, ПРИКЛАД ДЛЯ PRINTSCREEN.

Після кожної події клавіші реєструються решта клавіш (він же довжина масиву), а також ім'я коду клавіш (так що існує різниця між зрушенням ліворуч і праворуч тощо). Я не був впевнений, чи це була вимога, якщо ні, то ви можете відняти ще 10 байт від оцінки.

Обмеження

  • Це, здається, добре працює в Chrome

Я сподіваюся, що ця відповідь буде оцінена і, будь ласка, повідомте мене, чи зробив я щось не так.


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 байт завдяки Кевіну Крейсейну

2
f.setVisible(1>0);можна заграти в гольф f.show();і ()->можна його 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, моя інтерпретація виклику полягала в тому, що ми припускаємо, що саме використовується вказана клавіатура, особливо з урахуванням цього рядка: " якщо у вас ноутбук або будь-яка інша клавіатура, яка не має розкладки клавіатури США Standard 101, ви не можете виконати виклик, якщо ви не підключите сумісну клавіатуру ".
Shaggy

Я думаю, це досить справедливо, розумне рішення!
M4Y
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.