키보드의 모든 키를 확인하십시오


14

표준 101 키 US 키보드 의 모든 키를 기다리는 최단 프로그램 작성 * 누를 때까지 작성한 다음 OK 쓰기를 종료하십시오!

키를 누를 때마다 프로그램은 새로운 행에 모든 키를 한 번 이상 누를 때까지 누를 필요가없는 나머지 고유 키를 표시합니다. 프로그램은 101 키보드를 테스트하고 모든 키가 작동하는지 확인할 수 있어야합니다. 따라서 사용자에게 지정된 경우 키 또는 Enter 키를 두 번 누르는 것이 허용됩니다.

동일한 키를 두 번 이상 누르면 코드가 중단되거나 누르지 않은 나머지 키 수를 변경하지 않아야합니다.

모든 키 ( Left Shift, Right Shift, Right Control, Esc,Enter , 등)에 포함되어야한다.

실제 키보드 키는이 과제에서 프로그램의 관점에서 중요하므로 ( Aa, 동일 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를 지원해야합니까? (예 : Esc, Tab, Ctrl, Shift, Alt, Insert, 화살표 키, Caps Lock, Home, End, Page Up / Down, Backspace, Del, F 키 등)? 캐릭터와 이동 버전을 모두 눌러야합니까? Ctrl + 문자는 어떻습니까? 숫자 키패드 키는 일반 키와 다르게 계산됩니까?
손잡이

1
@Doorknob 미국 표준 101 키 레이아웃에 필요한 모든 101 키가없는 경우 랩탑 키보드를 사용하여 문제를 해결할 수 없습니다.
Eduard Florinescu

1
@ beta-decay이 질문을 닫은 대부분의 사람들은 그들이 이해하지 못하는 것을 묻지 않았으므로 추측하기가 어렵습니다.
에두아르 Florinescu

답변:


6

자바 스크립트, 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 루프가 추가되고 일부는 문자열로 저장됩니다. 예를 들어 왼쪽 및 오른쪽 컨트롤이 동일한 키 코드를 제공하기 때문에 "이중"키 코드에 대해 별도의 배열이 있습니다. 그러나 위치도 제공하므로 키 코드를 배열의 문자열 위치와 결합합니다. 거기에서 기본 키 다운 기능 (이 경우 F5로 새로 고침하지 않음)과 키 업을위한 별도의 이벤트 리스너를 방지하는 이벤트 리스너 일뿐입니다.

모든 키업 이벤트가 끝나면 나머지 키 (일명 배열의 길이)와 키 코드 이름이 기록됩니다 (왼쪽과 오른쪽 이동 등의 구별이 있습니다). 그것이 요구 사항인지 확실하지 않습니다. 그렇지 않으면 점수에서 다른 10 바이트를 뺄 수 있습니다.

한계

  • Chrome에서만 잘 작동하는 것 같습니다

이 답변에 감사 드리며 잘못된 일이 있으면 알려주세요.


5
PPCG에 오신 것을 환영합니다!
FantaC

세미콜론의 일부 또는 전부를 줄 바꿈으로 변경할 수 있습니까? 바이트 수에 도움이되지 않지만 훨씬 쉽게 읽을 수 있습니다.
Jordan

여기에 읽기 훨씬 쉽게 버전의 pastebin.com/PE4anSFw을
M4Y

4

자바 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 이외의 키를 누르면 스택 추적이 표준 오류로 인쇄되거나 예기치 않은 동작이 발생할 수 있습니다.

  • 이 프로그램은 키 코드 상수의 숫자 값을 직접 사용하며 Oracle KeyEvent설명서 에 따르면 이러한 값은 시간이 지남에 따라 변경 될 수 있습니다.

감사의 말

  • Kevin Cruijssen 덕분에 -10 바이트

2
f.setVisible(1>0);에 golfed 수 f.show();()->에 golfed 수 v->를 사용하여 사용되지 않는 Void null파라미터 .
Kevin Cruijssen

4

자바 스크립트, 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>


간과 한 것 중 하나는 Windows 키와 같이 101 키 키보드에없는 키를 누를 때도 카운트 다운된다는 것입니다.
M4Y

1
@ M4Y, 도전 과제에 대한 나의 해석은 지정된 키보드가 사용되는 것으로 가정하고, 특히이 줄을 감안할 때 : " 랩톱이나 미국 표준 101 키보드 레이아웃이없는 다른 키보드를 사용하면 충족 할 수 없습니다 호환되는 키보드를 플러그인하지 않으면 문제가 발생합니다. "
Shaggy

그것은 내가 생각하기에 공평한 해결책입니다!
M4Y
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.